일일 온도
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