[Java/자바] 프로그래머스 Lv2 - 주식 가격(Queue 큐)

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

 

제한사항
  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

 

입출력 예
prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

 

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

Solution.java

처음에 이 문제를 봤을 때 "뭔 말이야?"라고 생각하며 좀 당황스러웠는데

이해하고 보니 정말 간단했었습니다.

간단하게 설명하자면, 다음과 같습니다.

// prices의 배열이 [1, 2, 3, 2, 3] 일 때
- 첫 번째 가격인 1은 이후 가격들인 2, 3, 2, 3 보다 작으므로 가격이 떨어지지 않았습니다.
	=> 총 4초 동안 가격이 떨어지지 않았으므로 answer[] = [4, 0, 0, 0, 0] 이 됩니다.
- 두 번째 가격인 2는 이후 가격들인 3, 2, 3 보다 작으므로 가격이 떨어지지 않았습니다.
	=> 총 3초 동안 가격이 떨어지지 않았으므로 answer[] = [4, 3, 0, 0, 0] 이 됩니다.
- 세 번째 가격인 3은 이후 가격인 2 보다 크므로 가격이 떨어졌습니다.
	=> 1초만에 가격이 떨어졌으므로 answer[] = [4, 3, 1, 0, 0] 이 됩니다.
- 네 번째 가격인 2은 이후 가격인 3 다 작으므로 가격이 떨어지지 않았습니다.
	=> 총 1초 동안 가격이 떨어지지 않았으므로 answer[] = [4, 3, 1, 1, 0] 이 됩니다.
- 다섯 번째 가격인 3은 이후 가격이 없습니다.
	=> 총 0초 동안 가격이 떨어지지 않았으므로 answer[] = [4, 3, 1, 1, 0]이 됩니다.

 

자 이제 코드를 봅시다.

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class 주식가격 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(solution(new int[]{1, 2, 3, 2, 3})));
    }

    public static int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Queue<Integer> q = new LinkedList<>();

        for (int i : prices) {
            q.add(i);
        }

        int index = 0;
        while (!q.isEmpty()) {
            int currentPrice = q.poll();
            // currentPrice의 다음 가격부터 반복문을 진행 = i = (prices.length - q.size()
            for (int i = (prices.length - q.size()); i < prices.length; i++) {
                // 가격이 떨어 졌을 경우
                if (currentPrice > prices[i]) {
                    answer[index]++;
                    break;
                }
                // 가격이 떨어지지 않았을 경우
                if (currentPrice <= prices[i]) {
                    answer[index]++;
                }
            }
            index++;
        }
        return answer;
    }
}

많은 분들이 Stack으로 풀으셨는데 값을 카운팅하는 순서가 워낙 복잡했었습니다.

그래서 Queue를 활용하여 가격의 순서대로 값을 구하니 좀 더 수월하게 풀 수 있었습니다.

주석만으로 설명이 충분할 꺼라 생각하기에 설명은 따로 하지 않겠습니다.