Algorithms

[프로그래머스] 연습문제 - 주식가격

Sara.H 2020. 11. 30. 17:06

programmers.co.kr/learn/courses/30/lessons/42584

 

코딩테스트 연습 - 주식가격

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

programmers.co.kr

문제 요약

prices 정수 배열이 주어진다. 각 요소는 1 이상, 1만 이하인 자연수. 배열의 길이는 2 이상 10만 이하.

ex. [1, 2, 3, 2, 3]

각 요소는 주식 가격. 주식 가격이 떨어지지 않은 기간은 몇 초인지 return 하자.

 

ex1) 예시 배열 [1, 2, 3, 2, 3] 을 보면,

 

1-2-3-2-3

1 보다 가격이 낮아지지 않은 시간은 4초

2-3-2-3

2보다 가격이 낮아지지 않은 시간은 3초

3-2-3

3보다 가격이 낮아지지 않은 시간은 1초 (1초 뒤에 가격이 떨어짐)

2-3

2보다 가격이 낮아지지 않은 시간은 1초

3

3보다 가격이 낮아지지 않은 시간은 0초 (다음 가격 정보다 없음)

 

 

ex2) 예시 배열 [3, 5, 1, 2, 6, 2, 7, 2, 1] (내가 만든 무작위 정수 배열)

 

3-5-1-2-6-2-7-2-1

3보다 가격이 낮아지지 않은 시간은 2초

5-1-2-6-2-7-2-1

5보다 가격이 낮아지지 않은 시간은 1초

1-2-6-2-7-2-1

1보다 가격이 낮아지지 않은 시간은 6초

2-6-2-7-2-1

2보다 가격이 낮아지지 않은 시간은 5초

6-2-7-2-1

6보다 가격이 낮아지지 않은 시간은 1초

2-7-2-1

2보다 가격이 낮아지지 않은 시간은 3초

7-2-1

7보다 가격이 낮아지지 않은 시간은 1초

2-1

2보다 가격이 낮아지지 않은 시간은 1초

1

1보다 가격이 낮아지지 않은 시간은 0초

 

문제 해결 방법 생각하기

- 인풋 배열과 같은 크기의 보조 배열(int [] solution)을 만든다.

- 현재 배열을 2중 순회 하면서 현재 요소와 비교 대상 요소들을 비교하고,

- 만약 현재 요소가 비교 대상보다 작거나 같다면 solution 배열의 인덱스를 증가시킨다.

 

import java.util.Arrays;

public class StockPrice1 {

    public static void main(String[] args) {
        int [] prices = {3, 5, 1, 2, 6, 2, 7, 2, 1};
        int [] ans = solution(prices);
        System.out.println(Arrays.toString(ans));
    }

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

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

            for (int j = i; j < prices.length; j++) {
                if(j == prices.length - 1){
                    answer[j] = 0;
                    break;
                }
                if(cur <= prices[j]){
                    answer[i]++;
                }else{
                    break;
                }
            }
        }
        return answer;
    }
}

 

✨다른 풀이

public int [] solution(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]++; 
            //j = i + 1 로 시작하는 대신 미리 증가시켜둔다. 
            //j = i + 1 이므로, i = len - 1 일 때, j = len 이 되어서 answer 배열의 마지막 요소는 0이 된다. 
            if(prices[i] > prices[j]){
            	//현재가격  > 비교대상 
                break; 
            }
        }
    }
    return answer; 
}