티스토리 뷰
Algorithm/LeetCode
[LeetCode - Daily Challenge] 739. Daily Temperatures
Jaime.Lee 2021. 11. 14. 10:30Problem
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 <= 10^5
- 30 <= temperatures[i] <= 100
Solution
일별 기온이 배열로 주어질 때 각 날짜 이후에 더 따듯해지기까지 기다려야하는 일수를 배열로 만들어 반환하는 문제입니다.
스택에 인덱스를 저장하고 각 날짜의 기온과 스택에 저장된 인덱스에 해당하는 기온을 비교하면서 현재 기온이 더 높을 경우 인덱스간 차이를 결과 배열에 저장하면 답을 구할 수 있습니다.
import java.util.Stack;
public class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] result = new int[temperatures.length];
if (temperatures.length == 0) return result;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < temperatures.length; ++i) {
while (!stack.empty() && temperatures[i] > temperatures[stack.peek()]) {
int index = stack.pop();
result[index] = i - index;
}
stack.push(i);
}
return result;
}
}
스택을 직접 배열로 구현하여 사용하면 속도나 메모리를 더 절약할 수 있습니다.
public class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] result = new int[temperatures.length];
int[] stack = new int[temperatures.length];
int top = -1;
for(int i = 0; i < temperatures.length; i++) {
while(top > -1 && temperatures[i] > temperatures[stack[top]]) {
int idx = stack[top--];
result[idx] = i - idx;
}
stack[++top] = i;
}
return result;
}
}
Test
package io.lcalmsky.leetcode.daily_temparatures;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void givenTemperatures_whenCountDaysUntilWarmerTemperature_thenCorrect() {
assertAll(
() -> test(new int[]{73, 74, 75, 71, 69, 72, 76, 73}, new int[]{1, 1, 4, 2, 1, 1, 0, 0}),
() -> test(new int[]{30, 40, 50, 60}, new int[]{1, 1, 1, 0}),
() -> test(new int[]{30, 60, 90}, new int[]{1, 1, 0})
);
}
private void test(int[] given, int[] expected) {
// when
Solution solution = new Solution();
int[] actual = solution.dailyTemperatures(given);
// then
assertArrayEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- r
- JPA
- spring boot app
- 함께 자라기 후기
- 스프링 부트 애플리케이션
- intellij
- 스프링 부트
- QueryDSL
- spring boot application
- Spring Boot JPA
- 헥사고날 아키텍처
- Jackson
- 스프링부트
- 스프링 부트 튜토리얼
- Java
- spring boot jwt
- 함께 자라기
- proto3
- Spring Boot
- Spring Boot Tutorial
- 클린 아키텍처
- leetcode
- JSON
- 스프링 데이터 jpa
- Spring Data JPA
- Linux
- @ManyToOne
- 알고리즘
- 스프링 부트 회원 가입
- gRPC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함