소소한 컴퓨터 이야기

일일 온도

by Cori

문제

매일의 화씨 온도(˚F) 리스트 T를 입력받아, 더 따뜻한 날씨를 위해서는 며칠을 더 기다려야 하는지를 출력하라 

 

· 입출력 예 

T [73, 74, 75, 71, 69, 72, 76, 73]
return [1, 1, 4, 2, 1, 1, 0, 0] 

풀이

1. 스택 값 비교

-> 현재의 인덱스를 계속 스택에 쌓아두다가, 이전보다 상승하는 지점에서 현재 온도와 스택에 쌓아둔 인덱스 지점의 온도 차이를 비교하여, 더 높다면 스택의 값을 pop()으로 꺼내고, 현재 인덱스와 스택에 쌓아둔 인덱스의 차이를 정답으로 처리한다.

def dailyTemperatures(T: list[int]) -> list[int]:
    answer = [0] * len(T)
    stack = []
    
    for i, cur in enumerate(T):
        while stack and cur > T[stack[-1]]:
            last = stack.pop()
            answer[last] = i - last 
        stack.append(i)
        
    return answer

여기서 핵심 포인트는 스택에 값이 아닌, 인덱스를 집어넣는 것이다. 입력받은 배열의 두 번째 값부터 while문을 돌게 되는데, 현재 값이 stack의 맨 마지막 요소의 인덱스 지점의 온도보다 큰 동안 스택에서 값의 인덱스를 꺼내고, 현재 인덱스와 차이를 구해 날짜를 계산한다.

 

* 현재 온도가 stack의 마지막 요소의 인덱스 값보다 큰 경우(따뜻한 경우), 이를 꺼내서 기록

ex) [73, 74, 75, 71, 69, 72, 76, 73] 일 때 인덱스가 5인 지점에서 스택에는 [2, 3, 4]가 쌓여있게 된다. 계속 온도가 떨어지기만 하면서 처리되지는 못하고 스택에 계속 쌓이게 되기 때문


Info

1. for ~ while 구문을 살펴보면, 입력받은 배열의 첫 번째 값은 while문을 건너뛰고, stack에 값을 추가할 수 있다.

'CS > Coding Test' 카테고리의 다른 글

전화번호 문자 조합  (0) 2021.10.06
섬의 개수  (0) 2021.10.05
유효한 괄호  (0) 2021.10.03
두 수의 합  (0) 2021.10.02
가장 긴 팰린드롬 부분 문자열  (0) 2021.10.01

블로그의 정보

코딩하는 오리

Cori

활동하기