리트코드 알고리즘/리트코드 medium

(간단한 코드)리트코드 739. Daily Temperatures

문학적 딥러닝 2024. 12. 21. 03:14

 

이 문제는 온도 정보를 담고 있는 리스트의 각 인덱스가 날씨 순서라고 하면, 더 따뜻한 날이(더 큰 숫자가) 오기까지 얼마나 걸리는지 리스트로 정리하는 문제다. 

 

그렇다면, 우선 온도를 비교할 기준이 되는 숫자 변수, 더 큰 숫자에 관한 변수, 숫자 끼리의 인덱스 거리를 나타내는 변수 등등

많은 변수를 고려해야 하는 문제는 기본적으로 for문과 while문의 합작으로 이루어진다고 생각할 수 있다. 

 

우선 오답 코드를 보면 다음과 같다.

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        lt = len(temperatures)
        ans = []
        i = 0
        while i < lt-1:
            cnt = 0
            for t in temperatures[i+1:]:
                if temperatures[i] > t:
                    cnt += 1
                else:
                    cnt += 1
                    ans.append(cnt)
                    break                
            i += 1
        ans.append(0)
        return ans

 

이 문제에서 개인적으로 가장 어려웠던 점은, 첫번째 예시에서 76과 같이 큰 숫자 뒤에 더 큰 숫자가 없는 경우에 어떻게 숫자 0을 넣을지를 알 수가 없었다. 

 

그래서 우선 0으로 채워져 있는 정답 길이의 리스트를 먼저 준비해준다.

while문 안에 for문을 넣는 방법도 있지만, 반대의 방법으로 for문 안에 while문을 넣을 수도 있다.

정답 코드는 다음과 같다.

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        temps = temperatures #변수 이름이 너무 길어서 변수 선언
        lt = len(temps)	#길이는 이렇게 지정해 놓고 하는게 나중에 편한게 많다.
        ans = [0]*lt #정답 길이과 같은 0으로 채워진 리스트 생성
        stk = [] #요긴 하게 쓸 빈 리스트

        for i, t in enumerate(temps): #(아래 글로 설명)
            while stk and stk[-1][0] < t:
                stk_t, stk_i = stk.pop()
                ans[stk_i] = i - stk_i
            stk.append((t,i)) #여기서 (i,t)로 넣어도 상관없다, 다만 바꾼다면
            				  # while문에도 stk[-1][1]로 바꿔야 한다.
                              # 추가로 stk_i, stk_t=stk.pop() 로 순서도 바꿔야 한다.
        return ans

 

여기서 또 알아야 할 점 하나는, enumerate()라는 녀석인데, 이녀석은 일반적인 for문과 같지만, 여기에다가 인덱스 값을 같이 출력해주는 역할을 하고 있다.

 

따라서 for문에 있는 i에는 들어오는 숫자의 인덱스 값이 들어가고, t에는 우리가 흔히 쓰는 숫자 값이 들어간다.

 

맨 처음에는 stk가 빈 리스트여서 while문이 실행되지 않는다. 그리고 맨 마지막에도 어차피 0으로 채워져야 하는 상황이어서 코드가 돌아가지 않지만, 지장이 없다.