[programmers] 주식 가격 - Java

programmeaow·2022년 6월 1일
0

알고리즘

목록 보기
1/2

문제 : 프로그래머스 - 주식 가격

📑 풀이

스택/큐의 문제인 만큼 스택을 활용해서 문제를 풀어보고 싶었는데 아직은 이해도가 너무 부족한 것 같았다... 그래서 스택을 활용한 풀이를 검색해보고, 해당 코드를 분석하면서 공부했다.

지문 이해에 어려움이 있어서 프로그래머스의 해당 답변을 참고했다.
프로그래머스 : 문제 지문의 재해석 (이해 안되시는 분 참고해주세요)

public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Stack<Integer> stack = new Stack();
  • int [ ] answer : parameter로 받은 int 배열 타입인 prices의 전체 길이와 동일한 길이를 가진다.
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초간 가격이 떨어지지 않을 것이다.

그림과 함께 자세히 설명이 되어있어서 이해하는데에 큰 도움이 되었다!
이번 문제 풀이로 스택 구조에 대해 조금 더 알 수 있어서 좋았고, 내가 어느 부분을 이해하지 못하고 있었는지 알 수 있어서 좋았다.

- 전체 코드 ( 출처 : [프로그래머스] 주식가격(Stack) - JAVA )

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;
    }

}
profile
개발이란 뭘까

0개의 댓글