React

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.
Example 1:
Input: temperatures = [73,74,75,71,69,72,76,73] Output: [1,1,4,2,1,1,0,0]
Plain Text
복사
Example 2:
Input: temperatures = [30,40,50,60] Output: [1,1,1,0]
Plain Text
복사
Example 3:
Input: temperatures = [30,60,90] Output: [1,1,0]
Plain Text
복사
Constraints:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100

My solution

정수의 배열 temperatures이 일별 온도를 나타낸다. answer[i]라는 답이 더 따뜻한 온도를 얻기 위해 기다려야 하는 i 번째 일 수인 배열 answer을 반환합니다. 이 작업이 가능한 미래 날짜가 없으면 answer[i] == 0으로 답하십시오.
Example 1:
Input: temperatures = [73,74,75,71,69,72,76,73] Output: [1,1,4,2,1,1,0,0]
Plain Text
복사
73은 1일만 기다리면 더 높은 온도를 만난다.
74는 1일만 기다리면 더 높은 온도를 만난다.
75는 4일만 기다리면 더 높은 온도를 만난다.
스택에 넣어서 더 따뜻한 온도가 올 때까지 담아둔다.
따라서 for문 안에서 반복문을 두고 stack을 검사해야 한다.
while문은 조건(스택이 비어 있지 않고, 현재 인덱스=날의 온도가 스택의 top에 있는 온도보다 높을 때)에 따라 차레대로 반복할 수 있으므로 for문 안에 while문을 배치한다.
그러면 루프마다 stack의 top을 pop시켜서 이 인덱스를 가지고 answer 배열에 더 따뜻한 온도를 며칠만에 발견했는지 업데이트(currDay - prevDay) 해준다.
while문의 업데이트 작업이 끝나고 빠져 나왔을 때 다음 작업을 위해서 currDay(현재 날의 인덱스)를 push한다.
처음에 push하지 않는 이유는 맨 처음 stack에 넣은 상태로 시작하면 어차피 그 인덱스가 stack의 top과 같기 때문이다.

Code

/** * @param {number[]} temperatures * @return {number[]} */ const dailyTemperatures = function (temperatures) { const len = temperatures.length; const answer = Array.from({ length: len }, () => 0); const stack = []; for (let currDay = 0; currDay < len; currDay++) { while ( stack.length > 0 && temperatures[stack[stack.length - 1]] < temperatures[currDay] ) { const prevDay = stack.pop(); answer[prevDay] = currDay - prevDay; } stack.push(currDay); } return answer; }; describe('dailyTemperatures', () => { it('TC1', () => { expect(dailyTemperatures([73, 74, 75, 71, 69, 72, 76, 73])).toStrictEqual([ 1, 1, 4, 2, 1, 1, 0, 0, ]); }); it('TC2', () => { expect(dailyTemperatures([30, 40, 50, 60])).toStrictEqual([1, 1, 1, 0]); }); it('TC3', () => { expect(dailyTemperatures([30, 60, 90])).toStrictEqual([1, 1, 0]); }); });
JavaScript
복사