스택/큐의 문제인 만큼 스택을 활용해서 문제를 풀어보고 싶었는데 아직은 이해도가 너무 부족한 것 같았다... 그래서 스택을 활용한 풀이를 검색해보고, 해당 코드를 분석하면서 공부했다.
지문 이해에 어려움이 있어서 프로그래머스의 해당 답변을 참고했다.
프로그래머스 : 문제 지문의 재해석 (이해 안되시는 분 참고해주세요)
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
Stack<Integer> stack = new Stack();
for (int i = 0; i < prices.length; i++) {
while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
answer[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);
}
먼저 for 반복문을 사용하여 prices 값의 전체 길이만큼 반복해서 데이터를 확인해야한다.
확인 과정에서 만약 주식 가격이 감소하지 않으면 시간 값 ( for 반복문의 i 값 ) 을 stack에 push 해준다 -> 주식 가격 감소시 stack에 push해준 값 ( 주식 매수 시간 )을 주식이 감소한 시간, 즉. i 값에서 빼준다.
peek으로 주식 매수 시간 정보를 가져온 뒤에 pop으로 빼내서 제거해준다.
제거 후에는 다시 현재 시간을 stack에 push 해준다.
while (!stack.isEmpty()) {
answer[stack.peek()] = prices.length - stack.peek() - 1;
stack.pop();
}
return answer;
반복문을 다 돌게 되면 stack에는 4라는 값이 남아있게 된다.
stack에 값이 남아있는 경우는 주식 가격이 떨어지지 않았음을 의미하고, 해당 문제는 5초까지의 결과만 확인하므로 0초간 가격이 떨어지지 않을 것이다.
그림과 함께 자세히 설명이 되어있어서 이해하는데에 큰 도움이 되었다!
이번 문제 풀이로 스택 구조에 대해 조금 더 알 수 있어서 좋았고, 내가 어느 부분을 이해하지 못하고 있었는지 알 수 있어서 좋았다.
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++) {
while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
answer[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);
}
while (!stack.isEmpty()) {
answer[stack.peek()] = prices.length - stack.peek() - 1;
stack.pop();
}
return answer;
}
}