[LeetCode] 739. Daily Temperatures

2024. 3. 14. 18:45Algorithm Solution

[목차]

1. 문제 설명
2. 풀이 설명
3. 문제 풀이 source
  3.1 python
  3.2 java

 

1. 문제 설명

 

문제를 조금 설명하자면 날씨 온도의 정보가 들어온다. temperatures 배열이고 저 온도배열에서 첫번째부터 날짜이다. 즉 첫번째 날에는 73도라고 이해하면 된다. 기준이 되는 날짜부터 온도가 올라가는 날이 며칠인지 구하는 문제이다. 

예를 들면 [30,40,20,50] 이라는 배열이 있으면 첫째날 30도의 기준으로 보면 다음날이 40도라서 1일만 기다리면 온도상승이 된다. 따라서 output=[1,0,0,0]이 기록될 것이다. 

두번째 40도인 둘쨋날을 기준으로 보면 다음날 온도가 20도라서 낮아서 무시하고 그 다음날인 넷째날 50도라서 40도보다 높기 때문에 
둘째날부터 넷째날에 온도상승이 있기 때문에 2일을 기록한다. 
즉 output에는 [1,2,0,0]이 기록된다. 

세번째 날인 20도 입장에서는 마찬가지로 다음날이 50도라서 1일만 기다리면 되기 때문에 output= [1,2,1,0]이 나오면 된다. 

그리고 마지막날은 그 다음날이 없기 때문에 0일이라고 보면 된다.즉 마지막에 

output = [1,2,1,0] 이 나와야한다.

 

2. 풀이 설명

문제 풀이 
1. 오늘 온도를 기준으로 해서
  1.1 stack이 비어있으면 현재 날짜 index를 stack에 push
  1.2 stack에 데이터가 있고 내일 온도가 오늘 온도보다 높으면 output배열에서 stack에 있는 index를 꺼낸다. 내일 날짜 - 꺼낸      
        index 를 해서 날짜를 구한다. 그리고 output배열에 해당 index 데이터를 갱신한다.

 

3. 문제 풀이 source

  3.1 python

def dailyTemperatures(temperatures: List[int]) -> List[int]:
    answer = [0] * len(temperatures)
    stack = []
    for cur_day, cur_temp in enumerate(temperatures):
        while stack and stack[-1][1] < cur_temp:
            prev_day, prev_temp = stack.pop()
            answer[prev_day] = cur_day - prev_day

        stack.append((cur_day, cur_temp))

    return answer

  3.2 java

public int[] dailyTemperatures(int[] temperatures) {
        int[] result = new int[temperatures.length];
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < temperatures.length; i++) {
            while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {
                int pastDay = stack.pop();
                result[pastDay] = i - pastDay;
            }
            stack.push(i);
        }
        return result;
    }

'Algorithm Solution' 카테고리의 다른 글

[LeetCode] 20. valid Parentheses 문제풀이  (0) 2024.03.10
Two Sum - LeetCode  (0) 2024.01.25
백준 9095번 1,2,3 더하기  (0) 2017.02.27
백준 1991번 트리순회  (0) 2017.01.25
백준 10989 수 정렬하기 3 (java)  (0) 2017.01.02