코딩 테스트 (Python)/리트코드

[리트코드] 739. 일일 온도 (Python)

hihyuk 2024. 1. 4. 18:10
 

Daily Temperatures - LeetCode

Can you solve this real interview question? Daily Temperatures - Given an array of integers temperatures represents the daily temperatures, return an array answer such that answer[i] is the number of days you have to wait after the ith day to get a warmer

leetcode.com

문제

기준의 날의 온도가 입력되어있는 리스트에서 기준 날의 온도보다 더 높은 온도를 기록한 날과의 날짜 차이를 입력한 리스트를 출력한다.

 

과정

  1. output 리스트에 들어가는 값은 인덱스의 차이이다.그리고 마지막에 와서 뒤에 더 큰 값이 없는 애들도 자기 인덱스에 0을 채워넣어줘야 한다.
  2. 파이썬의 enumerate()는 리스트의 index와 value를 tuple로 반환해주니까 이것을 활용해서 value를 비교하고, index의 차를 새로운 리스트에 넣어준다.

ex)

  1. [3,4,5] 가 input이라면, index 0자리는 3 index 1은 4이므로 index 1의 자리가 더 크다. 그러므로 1-0 = 1을 해준 후 output에 저장해준다.
  2. 그 다음 index 1자리는 4, index 2자리는 5이므로 index 2의 자리가 더 크다. 그러므로 2-1=1을 output에 저장해준다.
  3. index 2자리의 5는 마지막이므로 0이 와서 output은 [1,1,0] 이 와야 한다.

 

입력

[73,74,75,71,69,72,76,73]

출력

[1,1,4,2,1,1,0,0]

 

풀이

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        stack = []
        lst= [0]*len(temperatures)
        for key, val in enumerate(temperatures):
            while stack and val > temperatures[stack[-1]]:
                last = stack.pop()
                lst[last] = key - last
            stack.append(key)
        return lst

 

한 줄씩 코드 해석해보기

stack = []
lst= [0]*len(temperatures)
  • stack을 이용해 문제를 풀기위한 리스트 생성
  • 입력받은 온도 리스트를 모두 0으로 만든 리스트 생성
for key, val in enumerate(temperatures):
  • 입력 받은 온도들을 0 ~ 마지막까지 key값을 만들고 val에 값을 넣어준다.
while stack and val > temperatures[stack[-1]]:
    last = stack.pop()
    lst[last] = key - last
stack.append(key)
  • stack의 제일 마지막 key값에 해당하는 온도보다 새로 들어온 온도가 더 높으면, 그 현재의 key 와 그 마지막 key의 차를 정답 리스트에 넣는다. 
  • stack에는 새 key 값을 넣는다.   
return lst​
  • 모든 차를 구한 후 lst 리스트를 return 한다.