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
복사