이 문제는 온도 정보를 담고 있는 리스트의 각 인덱스가 날씨 순서라고 하면, 더 따뜻한 날이(더 큰 숫자가) 오기까지 얼마나 걸리는지 리스트로 정리하는 문제다.
그렇다면, 우선 온도를 비교할 기준이 되는 숫자 변수, 더 큰 숫자에 관한 변수, 숫자 끼리의 인덱스 거리를 나타내는 변수 등등
많은 변수를 고려해야 하는 문제는 기본적으로 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으로 채워져야 하는 상황이어서 코드가 돌아가지 않지만, 지장이 없다.
'리트코드 알고리즘 > 리트코드 medium' 카테고리의 다른 글
(간단한 코드)리트코드 155. Min Stack (0) | 2024.12.22 |
---|---|
(간단한 코드)리트코드 150. Evaluate Reverse Polish Notation (0) | 2024.12.19 |
(간단한 코드)리트코드 56. Merge Intervals (0) | 2024.12.14 |