알고리즘 고득점 Kit

프로그래머스 주식가격 Java

preferrrr 2024. 4. 2. 16:25

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

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

제한사항

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

입출력 예

pricesreturn

[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

입출력 예 설명

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

2. 시나리오

  • 배열의 길이가 최대 10만이므로, O(nlogn) 안에 문제를 해결해야 한다.
  • 가격이 떨어지지 않을 때마다 시간(i)을 스택에 push한다. 
  • 스택의 최상단 시간의 주식 가격이 현재 주식 가격보다 크면 가격이 떨어진 것이므로, 현재 주식 가격이 더 클 동안 스택을 pop한다. 그리고, 
    최상단의 가격이 떨어지지 않은 시간 = 현재 시간 - 최상단의 시간
    answer[stack.peek()] = i - stack.peek()
  • 배열을 모두 돌고 나서, 스택에 남은 것들은 마지막까지 가격이 떨어지지 않은 것이 된다.
    answer[stack.peek()] = 배열의 길이 - stack.peek() - 1
  • 결과적적으로 O(2n)에 문제를 해결할 수 있다.

 

3. 코드

import java.util.*;

class Solution {
    
    // 0 1 2
    // 1 2 3
    // 
    public int[] solution(int[] prices) {
        int size = prices.length;
        int[] answer = new int[size];
        
        Stack<Integer> stack = new Stack();
        
        for (int i = 0 ; i < size; i++) {
            //스택의 최상단의 가격이 현재 가격보다 크면, 최상단에 있는 값은 현재 시점에 가격이 떨어진 것이다.
            //=> 스택의 최상단의 가격이 떨어지지 않은 시간 = 현재 시간 - push한 시간
            //    또한 스택에는 밑부터 위로 가격이 떨어지지 않도록 저장되어 있음.
            while (!stack.isEmpty() && prices[stack.peek()] > prices[i]) {  
                answer[stack.peek()] = i - stack.peek();
                stack.pop();
            }
            
            stack.push(i);
        }
        
        while (!stack.isEmpty()) { // 스택에 남은 것들은 마지막까지 가격이 떨어지지 않은 것
            answer[stack.peek()] = prices.length - stack.peek() - 1;
            stack.pop();
        }
        
        
        return answer;
    }

}