[JAVA] Lv2. 주식가격

김상윤·2022년 7월 3일
0

스택/큐 주식가격


[문제설명]

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

[제한 사항]

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

[입출력 예]
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초간 가격이 떨어지지 않았습니다.

[나의 풀이]

package level2;

public class 주식가격{
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length]; //0으로 초기화
        for (int i = 0; i < prices.length; i++) {
            for (int j = i + 1; j < prices.length; j++) {
                if (prices[j] >= prices[i])
                    answer[i]++;
                else {
                    answer[i]++;
                    break;
                }
            }
        }

        return answer;
    }
    public static void main(String[] args) {
        주식가격 answer = new 주식가격();
        int[] prices = {1,2,3,2,3};
        int[] result = answer.solution(prices);
        for (int e : result)
            System.out.println("e = " + e);
    }
}

스택/큐 문제이지만, 당장 스택/큐를 사용한 풀이법 보다 다른 풀이법이 생각나서 위와 같이 풀이해 보았다. 2중 반복문으로 풀이하였다.

로직은 아래와 같다.

  1. 입력으로 들어온 배열의 길이와 같은 길이의 0으로 초기화된 배열을 생성해준다.
  2. for 반복문을 돌면서, 숫자를 하나 선택한다.
  3. for 반복문안에 다른 for 반복문을 통하여, 선택한 숫자 다음의 숫자들과 선택한 숫자를 비교해준다.
  4. 만약 선택한 숫자가 다음의 숫자들보다 작거나 같으면, 해당 주식가격은, 1초동안 떨어지지 않은것이므로 1에서 생성해준 배열의 선택한 숫자의 인덱스에 값을 계속 더해준다.
  5. 만약 가격이 떨어진 경우, 1초동안은 가격이 유지되었다고 여기므로, 생성해준 배열의 선택한 숫자의 인덱스에 값을 더해준 뒤, 반복문을 탈출한다.

처음에는 답이 계속 틀리길래, 로직에 문제가 있나 생각했지만,
입출력 예 설명에서 "1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다." 해당 문구를 놓치고 문제를 풀고 있었다.

현재는 prices 배열의 길이가 100000이하이므로, 위의 로직이 통과가 되었지만, 배열의 길이가 더 길어지면, 아마 스택/큐 자료구조를 이용하여 풀이를 해야 통과가 될 수도 있을 것이다.

해당 문제는 추후에 스택/큐 자료구조를 이용하여 풀이해볼 예정이다.

아래는 채점결과이다.

profile
알고리즘을 아직도 모르겠다

0개의 댓글