🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
⚠️ 제한 사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
✨ 내 코드
import java.util.Stack;
class Solution {
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
Stack<Integer[]> stack = new Stack<>();
for (int i = 0; i < prices.length; i++) {
Integer[] val = {i, prices[i]};
// 스택이 비었거나 상승장일 때
if (stack.isEmpty() || stack.peek()[1] <= prices[i]) {
stack.push(val);
} else {
// 스택이 비어있지 않고 하락장일 때 기간 추가
while(!stack.isEmpty() && stack.peek()[1] > prices[i]) {
Integer[] tmp = stack.pop();
answer[tmp[0]] = i - tmp[0];
}
stack.push(val);
}
}
// 스택에 남아있는 값들 기간 추가
while(!stack.isEmpty()) {
Integer[] tmp = stack.pop();
answer[tmp[0]] = (prices.length - 1) - tmp[0];
}
return answer;
}
}
💡 풀이
- 기간 계산을 위해 인덱스와 가격을 배열로 만든다.
- 하락장이 발생할 때만 계산을 새로하면 되므로 스택이 비었거나 상승장일 땐 push한다
- 스택이 비어있지 않고 하락장이 발생했을 때 while문을 돌며 그 기간을 답 배열에 저장한다.
- 스택에 남아있는 원소들은 끝까지 가격이 떨어지지 않은 원소로 가장 최근에 삽입한 원소와의 기간을 답 배열에 저장한다.
💭 회고
푸는 것보다 문제를 이해하는 것이 더 어려웠던 문제였다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [Java] Lv2. 올바른 괄호 (1) | 2025.06.01 |
|---|---|
| [Java] Lv2. 짝지어 제거하기 (0) | 2025.06.01 |
| [Java] Lv1. 크레인 인형뽑기 (0) | 2025.06.01 |
| [Java] Lv2. 괄호 회전하기 (0) | 2025.06.01 |
| [Java] Lv2. 표 편집 (0) | 2025.06.01 |