티스토리 뷰

문제 원본 링크: programmers.co.kr/learn/courses/30/lessons/42584

카테고리: 스택/큐

 

문제 설명

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

 

제한 사항

  1. prices의 각 가격은 1 이상 10,000 이하의 자연수
  2. prices의 길이는 2 이상 100,000 이하

 

입출력 예시

int[] prices = {1, 2, 3, 2, 3}; // return = [4,3,1,1,0]

 

입출력 예시 설명

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

 


풀이 과정

  1. Queue에 모든 배열의 수를 차례로 저장한다.
  2. 큐의 값이 없을 때까지 반복문 while을 실행한다. fdf
  3. for문을 실행해 큐의 값을 하나씩 꺼내 배열의 다음 칸 수를 차례로 비교한다.
  4. 비교한 값보다 큐에서 꺼낸 값이 크면 for문을 종료한다. 
  5. 그렇지 않다면 answer에 1을 더한다.

 

자바 코드

public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];

        Queue<Integer> queue = new LinkedList<>();
        for (int price : prices) queue.add(price);

        while (!queue.isEmpty()) {
            int price = queue.poll();
            for (int i = prices.length - queue.size(); i < prices.length; i++) {
                answer[prices.length - queue.size() - 1] ++;
                if (price > prices[i]) break;
            }
        }

        return answer;
    }

 

채점 결과

 

첫 문제라 그런지 난이도는 높지 않게 느껴졌다. 스택/큐 카테고리에 있는 문제여서 큐를 사용했지만 스택을 사용할 수도 있고 전혀 사용하지 않고도 풀 수 있다. 아래는 for문만을 이용해 문제를 푼 다른 사람의 풀이다.

 

다른 사람의 풀이

public int[] solution2(int[] prices) {
        int len = prices.length;
        int[] answer = new int[len];
        int i, j;
        for (i = 0; i < len; i++) {
            for (j = i + 1; j < len; j++) {
                answer[i]++;
                if (prices[i] > prices[j])
                    break;
            }
        }
        return answer;
    }

 

참고

- 깃허브 소스코드: 링크

댓글