728x90
https://leetcode.com/problems/daily-temperatures
일일 기온 정보가 저장된 배열 temperatures가 주어지고, 각각의 날짜별 기온보다 더 높은 기온이 나타나는데 며칠이 걸리는지 구하는 문제이다. 만약 더 높은 기온이 없다면 0을 저장한다.
각 날짜에서 며칠을 기다려야 하는지 배열에 저장했다면 더 이상 이전의 날짜 정보를 저장할 필요가 없으므로 스택 자료구조를 사용하면 빠르게 접근할 수 있을 것으로 생각했다.
- 스택에는 기온 대신 본인보다 더 높은 기온을 만나지 못한 기온의 인덱스를 저장.
- 스택의 top에는 가장 높은 기온의 인덱스가 저장 될 수 있도록 함.
- 스택 안에 있는 기온은 더 높은 기온을 만나지 못한 날짜이므로 top보다 더 높은 기온을 만났다면 스택이 빌 때까지 pop을 반복.
- 이 때, 스택을 비우면서 현재까지의 가장 높은 기온과의 거리를 인덱스의 차로 구하여 ans배열에 저장.
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
Deque<Integer> st = new ArrayDeque<>();
int[] ans = new int[temperatures.length];
for(int i = 0; i < temperatures.length; i++){
while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){
int idx = st.pop();
ans[idx] = i - idx;
}
st.push(i);
}
return ans;
}
}
이 코드의 시간복잡도를 구할 때 for 와 while문을 중첩하여 구현하였기 때문에 O(n^2)이라고 생각할 수도 있지만, while문은 코드가 끝날 때 까지 n번만 반복되므로 최대 O(2n) O(n)의 시간 복잡도를 가지게 된다.
다른 문제를 풀 때도 주어진 데이터의 값을 활용할 지, 인덱스를 활용할 지를 생각해보면서 풀면 좋을 것 같다.
728x90
'Algorithm > LeetCode' 카테고리의 다른 글
DP | 70. Climbing Stairs Java (2) | 2024.08.24 |
---|---|
DFS | LeetCode - 200. Number of Islands Java (0) | 2024.07.30 |
BFS | LeetCode - 841. Keys and Rooms java (0) | 2024.07.23 |
DFS | N-Queens Java (0) | 2024.07.20 |
Stack | 20. Valid Patentheses (0) | 2024.07.05 |