본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 주식 가격 (lv.2)

- 내 방법 풀이

  • 어제에 이어 공부한 스택/큐 문제를 풀었으나, 평이한 난이도의 문제였고 굳이 스택/큐를 쓰지 않아도 되는 문제였다.
  • 특이하게 주식의 값을 가지고 그 값이 몇초동안 떨어지지 않았는지를 각 가격별로 구하여 리턴하는 문제였다.
  • 해당 주식의 값을 설정한 뒤 그 뒤의 가격들과 비교하면서 시간을 상승시키다가 떨어지면 반복문을 종료하는 식으로 코드를 구성했다.
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        for (int i = 0; i < prices.length; i++) {
            int price = prices[i];
            for (int j = i+1; j < prices.length; j++) {
                answer[i]++;
                if (price > prices[j]) {
                    break;
                }
            }
        }
        return answer;
    }
}

- 다른 사람 방법 풀이

  • 문제의 유형에 맞게 스택을 활용하셔서 푸셨다. 
  • 스택의 특징(FILO)을 활용하여, 스택에서 값을 하나 꺼내 뒤로 순회하면서 가격이 떨어질 때의 index값에서 초기 인덱스값을 뺀 값을 다시 스택에 넣는 방법으로 한 바퀴 순회한 뒤, 스택에 남은 값들을 다시 꺼내서 terms배열에 저장하는 방식으로 푸셨다.
  • 코드를 한 번 읽어보며 이해하는 방법으로도 공부가 되는 것 같다.
import java.util.Stack;

class Solution {
    public int[] solution(int[] prices) {
        Stack<Integer> beginIdxs = new Stack<>();
        int i=0;
        int[] terms = new int[prices.length];

        beginIdxs.push(i);
        for (i=1; i<prices.length; i++) {
            while (!beginIdxs.empty() && prices[i] < prices[beginIdxs.peek()]) {
                int beginIdx = beginIdxs.pop();
                terms[beginIdx] = i - beginIdx;
            }
            beginIdxs.push(i);
        }
        while (!beginIdxs.empty()) {
            int beginIdx = beginIdxs.pop();
            terms[beginIdx] = i - beginIdx - 1;
        }

        return terms;
    }
}