[LeetCode] Daily Temperatures

코테연습|2025. 6. 25. 23:13

https://leetcode.com/problems/daily-temperatures/description/?envType=study-plan-v2&envId=leetcode-75

 

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]


Example 2:
Input: temperatures = [30,40,50,60]
Output: [1,1,1,0]


Example 3:
Input: temperatures = [30,60,90]
Output: [1,1,0]
 

Constraints:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100


일별로 기온이 기록된 배열이 주어지고,

i번째 날보다 따뜻한 날이 되려면 최소 며칠을 기다려야 하는지를 i번째에 기록한 새로운 배열 answer를 리턴하는 문제다.

 

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function(temperatures) {
    // 더 따뜻한 날이 될때까지 걸리는 일수를 리턴, 같은 날만 있거나 없으면 0
    const stack = [];
    for(let i=0; i < temperatures.length; i++){
        let ans = 0;
        while(i+ans < temperatures.length){
            ans++;
            if(temperatures.at(i+ans) > temperatures.at(i)){
                stack.push(ans);
                break;
            }
            if(i+ans == temperatures.length){
                stack.push(0);
            }
        }
    }
    return stack;
};

 

이렇게 풀면 아니나다를까 TimeLimit Exceeded 뜸ㅎㅎ

 

 

아니 근데 이건 너무한 거 아니냐고ㅋㅋㅋ [99, 99, 99, 99, .... , 100] 이 테스트케이스였다;;;

코드 구조가 비효율적인것과는 별개로, Array.at()은 맨 끝에서부터 접근이 필요한 게 아니라면 굳이 안 쓰는 게 더 낫다.

 

 

Monotonic Stack을 이용해서 풀라고 준 문제니까 그 방식으로 풀어 보자.

 

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function(temperatures) {
    // 더 따뜻한 날이 될때까지 걸리는 일수를 리턴, 같은 날만 있거나 없으면 0
    const stack = [];
    const result = new Array(temperatures.length).fill(0);
    for(let i=0; i < temperatures.length; i++){
         while (stack.length > 0 && temperatures[i] > temperatures[stack[stack.length - 1]]) {
            const prevIndex = stack.pop();
            result[prevIndex] = i - prevIndex; // 며칠 뒤인지 계산
        }
        stack.push(i);
    }
    return [];
};

 

훨씬 깔끔하네요.

 

var dailyTemperatures = function(temps) {
	const length = temps.length;
	let result = new Uint32Array(length);
	for (let i = length - 2; i >= 0; i--) {
		const ct = temps[i];
		let j = i + 1
		while (temps[j] <= ct && j < length) {
			if (result[j] === 0) {
				j = length;
				break;
			}
			j = j + result[j]
		}
		if (j < length) {
			result[i] = j - i;
		}
	}
	return result;
}

 

이렇게 DP로 푼 사람도 있었다ㅋㅋㅋㅋ

세상은 넓고 잘하고 열심히 하는 사람도 참 많다...

'코테연습' 카테고리의 다른 글

[LeetCode] Longest Common Subsequence  (0) 2025.07.01
[LeetCode] Single Number  (0) 2025.06.17
[LeetCode] Counting Bits  (0) 2025.06.16

댓글()