사진과코딩

[LeetCode] Daily Temperatures 본문

KB IT's Your Life

[LeetCode] Daily Temperatures

Dev_Fuji 2024. 7. 5. 22:24

Link : https://leetcode.com/problems/daily-temperatures/description/

문제 파악

1. 현재의 온도 보다 더 높은 날짜를 구한다
2. 배열의 길이가 10^5이르모 완전 탐색을 통해 구현하면 O(n^2)이므로 timeout발생
3. O(n)으로 탐색할 수 있는 방법으로 구현

접근 방법

1. Deque<Integer> stack 생성
2. 스택에 날짜 push => 온도를 넣을경우 중복되는 온도가 있으면 날짜를 확인 할 수 없다. 또한, 날짜를 통해 온도를 확인할 수 있다.
3-1. 스택이 비어있지 않은데 이전 값(stack.peek())보다 현재 값(j)이 작으면 push => 어제보다 온도가 낮다
3-2. 스택이 비어있지 않은데 어제보다 현재 값이 크면 검사 => 어제보다 온도가 높다
			1) 어제보다 현재 값이 큰지 확인 => 크면 어제의 답을 구할 수 있다.
			   => temperatures[stack.peek()] < temperatures[j]
			2) 현재 값 - stack.pop()은 stack.pop()한 날짜보다 현재의 온도가 가장 가까운 더 높은 온도를 가진 날짜의 차이다.
			   => arr[day] = j-stack.pop()
			3) stack.pop()을 통해 이전 stack의 값과 현재의 값을 비교하는 것을 반복한다.
			   만약 stack.peek()의 값이 현재 값보다 작으면 반복을 종료한다 => 이전의 날짜보다 현재의 온도가 낮다
			4) 2.로 돌아간다.
		

 

💡 실패한 사례
1. 2 중 for 문 : 시간 초과 발생 ⇒ 2 중 for문을 통해 int[] 객체 하나 하나 stack에 넣으며 순서대로 탐색한다 ⇒ 배열의 길이가 10^5이라 시간 초과 발생

코드 구현

public int[] dailyTemperatures(int[] temperatures) {
        int []arr = new int [temperatures.length];
        Deque<Integer> stack = new ArrayDeque<>();
        for(int j = 0; j <temperatures.length;j++) {
            while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[j]){
                int day = stack.pop();
                arr[day] = j-day;
            }
            stack.push(j);
        }
       return arr;
    }

배우게 된 점

💡 stack을 통해 탐색을 더 빠르고 효율적으로 구현할 수 있다.

 

'KB IT's Your Life' 카테고리의 다른 글

취업 그리고 퇴소  (0) 2024.08.11
[LeetCode] Valid Parentheses  (0) 2024.07.05
[Vue.js] Axios  (0) 2024.06.04
[Node.js] Router 만들기  (0) 2024.06.04
[Vue.js] Router 만들기  (0) 2024.06.04