코딩테스트

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

Adose 2025. 2. 13. 19:13

📘요구 사항 정리

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

 

📌 제약 조건

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

 

📌 문제 분석

  • 배열의 index가 초 시점인 것 같다.
  • 문제 해석은 다음과 같다.
    1. 배열 0의 값이 1달러 일때, 배열 1의 값은 2이기 때문에 가격이 떨어지지 않았다.
    2. 배열 1의 값이 2달러 일때, 배열 3의 값은 3이기 때문에 가격이 떨어지지 않았다.
    3. 배열 3의 값이 3달러 일대, 배열 4의 값은 2이기 때문에 1초간 가격이 떨어지지 않았다.
  • 배열 1의 값 1달러는 1,2,3,4 초간 맨 마지막 까지 가격이 떨어지지 않았고,
  • 배열 2의 값 2달러는 2,3,4초간 마지막 까지 가격이 떨어지지 않았고,
  • 배열 3의 값은 1초 뒤에 가격이 떨어지기 때문에, 그 시간 1초 동안 가격이 떨어지지 않았다.
  • 배열 4의 값은 1초 뒤 가격이 현재 가격보다 크기 때문에 가격이 떨어지지 않았다.
  • 배열 5의 값은 마지막 이기 때문에 0초로 넣어준다.

 

📌 구현코드

아래는 예시 데이터이다. 

{1, 2, 3, 2, 3};
package pra.lv2.주식가격;

public class answer_1 {

    public static void main(String[] args) {
        int [] prices = {1, 2, 3, 2, 3};

        prices = solution(prices);

        for(int data : prices){
            System.out.print(data + " ");
        }
    }

    public static int[] solution(int[] prices) {

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

        int [] count = new int [prices.length];

        for(int i=0; i<prices.length;i++){
            int validData = prices[i];

            //i+1부터 하면 i의 다음 순서부터 차례대로 비교할 수 있다.
            for(int j=i+1;j<prices.length;j++){
                //현재 위치의 값보다 다음값이 크다면 가격이 유지 된 것이다.
                //
                if(validData<=prices[j]){
                    //해당 되는 위치에 값을 더해준다.
                    count[i]++;
                } else if(validData>prices[j]){
                    count[i]++;
                    break;
                }
            }
        }
        return count;
    }
}

 

📌 구현코드 해설

  • 비교할 값을 int validData = prices[i]; 를 통해서 꺼내준다.
  • 현재 값은 다음 값들과 비교해야 하기 때문에 2중 for문을 사용했다.
    • for(int j=i+1;j<prices.length;j++)
    • 위 식을 사용하게 되면 현재 값을 제외한 다음 값들을 비교할 수 있을 것이다.
  • if(validData<=prices[j])
    • 안쪽 for문을 통해서 현재 데이터보다 다음 데이터의 값이 크거나 같으면 가격이 유지 된 것이다.
    • 해당되는 배열에 ++를 통해서 값을 올려준다.
  • else if(validData>prices[j])
    • 위 조건문은, validData = 현재 비교하려는 값, pirces [j] 다음 값
    • 현재값이 다음 값보다 크다는 뜻은, 다음 값일때 값이 줄어든 다는 말이다. 
    • 현재 데이터는 다음 데이터일때 값이 줄긴 하겠지만, 현재 시간 동안은 유지 된 것 이기 때문에 count++를 해준 후에 종료 한다.