공부/알고리즘, 자료구조

[프로그래머스] 주식가격

오잎 클로버 2022. 2. 17. 08:30
728x90

 해당 문제의 링크는 여기입니다. 

Queue를 활용하여 문제를 해결하였습니다.

※효율성 테스트가 있습니다. 혼자서 푸실 분들은 유의해주세요.※

제한사항

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

문제만 보고 헷갈릴 수 있습니다.

질문하기에 자세히 작성해주신 분이 있으셨습니다. 감사합니다. (링크)

알고리즘

굉장히 간단한 문제입니다.

배열로도 충분히 해결할 수 있는 문제입니다.

하지만 스택으로 문제를 해결하려고 했지만, 스택을 자주 사용해보지 않아 

잘 몰라, 그나마 조금이라도 더 아는 Queue로 문제를 해결하였습니다.

public int getTimeWhenFalls(int currentPrice, Queue<Integer> leftStocks) {
    int i = 0;
    for (int price : leftStocks) {
        i++;
        if (price < currentPrice) {
            break;
        }
    }
    return i;
}

메소드명을 어떻게 지어야 할지 몰라 아무렇게 지었습니다.

기본적으로 카운트를 해주는 변수, i는 계속 +1을 끊임없이 합니다.

이는 시간이 흘렀음을 표현합니다.

현재 가격보다 작은 값이 존재한다면 break를 사용하여 i값에 더 이상 변화하지 않도록 합니다.

 

public int[] solution(int[] prices) {
    Queue<Integer> stockPrices = new ArrayDeque<>();
    for (int price : prices) {
        stockPrices.add(price);
    }

    int i = 0;
    int[] result = new int[prices.length];
    while (!stockPrices.isEmpty()) {
        int currentPrice = stockPrices.poll(); // 삭제 및 값 가져옴

        int countPriceFalls = getTimeWhenFalls(currentPrice, stockPrices); // 가격이 떨어지기까지 버틴 시간

        result[i++] = countPriceFalls;
    }

    return result;
}

큐에 모든 배열 값을 옮겨 담은 후, 큐가 빌 때 동안 반복합니다.

poll 메소드로 큐에서 가장 첫 번째에 있는 값을 반환 및 삭제합니다.

그리곤 아까 작성한 메소드를 호출하여 언제까지 버틸 수 있는지 판단합니다.

그 후, result 배열에 값을 저장합니다.

 

전체 소스코드

import java.util.*;

class Solution {
    public int[] solution(int[] prices) {
        Queue<Integer> stockPrices = new ArrayDeque<>();
        for (int price : prices) {
            stockPrices.add(price);
        }

        int i = 0;
        int[] result = new int[prices.length];
        while (!stockPrices.isEmpty()) {
            int currentPrice = stockPrices.poll(); // 삭제 및 값 가져옴

            int countPriceFalls = getTimeWhenFalls(currentPrice, stockPrices); // 가격이 떨어지기까지 버틴 시간

            result[i++] = countPriceFalls;
        }

        return result;
    }

    public int getTimeWhenFalls(int currentPrice, Queue<Integer> leftStocks) {
        int i = 0;
        for (int price : leftStocks) {
            i++;
            if (price < currentPrice) {
                break;
            }
        }
        return i;
    }
}

추가로

코드가 매우 단순합니다.

자바를 조금이라도 아시거나, 알고리즘 문제를 자주 푸신 분들이라면 금방 해결하실 수 있으십니다.

 

 

이상입니다.