Programming/leetcode

739. Daily Temperatures

홍열 2021. 2. 17. 23:05
728x90

주어진 배열의 값이 화씨이고, 몇번째 뒤에 나보다 큰 온도가 나오는지 확인하는 문제 

 

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

만약 [0]번째인 73은 바로 1일 뒤에 74가 온다. 따라서 1일 뒤에 더 따뜻한 날씨가 나온다. 

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

 

1) 이중 for문으로 풀어봤지만, 시간 초과 

    def dailyTemperatures(self, T: [int]) -> [int]:
        # 기본값이 0인 배열을 만드는 방법 2가지
        # ans = [0] * len(T)
        # ans = [0 for _ in range(len(T))]
        ans = [0] * len(T)

        for i in range(len(T)):
            cnt = 1
            for j in range(i+1, len(T)):
                if T[i] < T[j]:
                    ans[i] = cnt
                    break
                cnt += 1
        return ans

O(n)번만에 풀 수 있는 방법이 있을까? --> stack 활용

 

2) stack 활용

현재 값과 stack의 top값을 비교해서, 현재값이 더 크면 stack의 top이 종료...

[73, 74, 75, 71, 69, 72, 76, 73]이 있으면 

stack = 73

현재 값이 74이면,  stack top < 현재값 이므로, 73의 정답은 1이 된다. 

stack top보다 작은 값이면 계속해서 stack에 쌓는다. 

stack top보다 큰 값이면, POP하고 해당 index 지점에 값을 넣는다. 

 

이 경우에는 stack에 값을 저장하는 것이 아니라, 위치(index)를 저장하면서 문제를 해결해야된다. 

    def dailyTemperatures(self, T: [int]) -> [int]:
        # 기본값이 0인 배열을 만드는 방법 2가지
        # ans = [0] * len(T)
        # ans = [0 for _ in range(len(T))]
        ans = [0] * len(T)
        stack = []
        for i, value in enumerate(T):
            while stack and T[stack[-1]] < value:
                pos = stack.pop()
                ans[pos] = i - pos
            stack.append(i)
        return ans

index를 어떻게 활용해야되는지 배운 문제