본문 바로가기

카테고리 없음

[LeetCode] 739. Daily Temperatures

 

739. 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 temperature. If there is no future day for which this is possible, keep answer[i] == 0 instead.

 

 

1. 문제 상황

문제를 간단히 다시 보기 : 오늘 온도가 더 따뜻해지려면 며칠을 기다려야 하는지

앞에서부터 풀면 모든 날에 대해 모든 이후 날들을 다 비교해야 하니까 매우 비효율적임

Brute Force는 O(n^2)이 된다.

 

2. 뒤에서부터 찾아보면 어떨까?

우리가 찾고 싶은 건 더 따뜻한 날이기 때문에 뒤에서 앞으로 살펴보면 이미 지나간 일을 기억할 필요가 없음.

왜냐하면 뒤에서부터 보면 미래 정보를 계속 update 할 수 있기 때문.

 

3. stack

스택은 항상 이전까지 확인한 온도들 중 가장 의미 있는 값들로만 남겨두기

 

def dailyTemperatures(temperatures):
    n = len(temperatures)          # 전체 날 수
    answer = [0] * n               # 결과를 저장할 리스트
    stack = []                     # 스택 (인덱스를 저장)

    # 뒤에서 앞으로 순회
    for i in range(n - 1, -1, -1):  # i: 현재 날의 인덱스
        # 현재 온도보다 낮거나 같은 온도는 스택에서 제거
        # 이렇게 하면 스택의 맨 위는 항상 가장 가까운 더 높은 온도의 가진 날의 인덱스를 갖게 됨
        while stack and temperatures[stack[-1]] <= temperatures[i]:
            stack.pop()

        # 스택이 비어 있지 않다면, 더 따뜻한 날이 존재
        # index를 이용해 더 따뜻한 날까지의 거리를 계산
        if stack:
            answer[i] = stack[-1] - i  # 더 따뜻한 날까지의 거리 계산

        # 현재 날을 스택에 추가
        stack.append(i)

    return answer

 

예제 입력 : temperatures = [73, 74, 75, 71, 69, 72, 76, 73]

날짜 온도 스택 : 인덱스(온도) answer 설명
7 73 [7(73)] 0 마지막 날 : 더 따뜻한 날 없음
6 76 [6(76)] 0 현재 온도 > 스택의 온도 -> 스택 갱신
5 72 [6(76), 72(5)] 1 스택의 top이 더 따뜻함
4 69 [6(76), 72(5), 69(4)] 1 스택의 top이 더 따뜻함
3 71 [6(76), 72(5), 71(3)] 2 스택의 top에서 69 index 제거, 72가 더 따뜻함
2 75 [6(76), 2(75)] 4 71, 72 제거 -> 76이 더 따뜻함