조급하면 모래성이 될뿐

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

Algorithm/Programmers

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

Pawer0223 2019. 10. 30. 22:21

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42584

 

코딩테스트 연습 - 주식가격 | 프로그래머스

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지

programmers.co.kr

나의 풀이

우선 문제에 대한 간단한 설명을 하자면 i번째 금액이 언제 감소하느냐?이다.

 

그리고 문제를 이해하면 마지막 index의 값은 무조건 0일 수밖에 없다.

 

그래서 i번째부터 i < length-1까지 조회를 한다. ( length-1 값은 초기 값 0 그대로 둔다. )

 

마지막 index를 안 봐도 되는 이유는 

 

1,2,3,2,0이라고 가정했을 때 

1원의 가격이 떨어지는 시점은 마지막이고, 마지막까지 가야 결과를 알 수 있으니 4초 걸린다.

[ 1 -> 2,3,2,0 ]

2원의 가격이 떨어지는 시점도 마지막이고, 마지막까지 가야 결과를 알 수 있으니 3초 걸린다.

[ 2 -> 3,2,0 ]

 

1,2,3,2,3이라고 가정했을 때

1원의 가격이 떨어지는 시점은 없다, 결국 마지막까지 가보고 4초이다.

[ 1 -> 2,3,2,3 ]

2원의 가격이 떨어지는 시점도 없다, 결국 마지막까지 가보고 3초이다.

[ 2 -> 3,2,3 ]

 

즉, 마지막 INDEX는 무조건 가야 하기 때문에 결과는 동일하다. 

 

그리고 비교조건은 i와 i+1부터 시작하지 않고, i와 i번째부터 시작을 하였다.

 

i부터 보게 됨으로써 마지막 index를 보지 않아도 자기 자신을 카운트하기 때문에 총 Cnt에 +1이 계산된다.

 

또,  [ 1,2,3,2,3 ]의 경우에서 붉은색의 경우 3의 금액은 바로 다음에 떨어지는데, 첨부한 코드에서는 while의 조건을 현재 price보다 작은 값을 만나면 빠져나오게 되기 때문에 i+1부터 보면 Cnt를 증가할 수 없기 때문에도 있다.

 

코드

package Programmers.Level2;

import java.util.Arrays;

public class StockPrice {

	public static void main(String[] args) {

		int[] prices = {
				3,3,3,3,1
		};

		int[] answer = solution(prices);

		System.out.println(Arrays.toString(answer));


	}//main

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

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

		for ( int i = 0 ; i < prices.length-1; i ++ ) {
			
			int price = prices[i];
			
			int j = i ;
			
			int cnt = 0 ;
			
			// 마지막 값은 무조건 0이기 때문에 초기 값 그대로 둔다.
			// price값이 더 큰경우에 빠져나온다 !
			// length -1 까지 보고 && 한칸차이로 떨어지는 경우가 존재하기때문에 j값은 i부터 시작.
			while ( j < prices.length-1 && price <= prices[j] ) {
				j++;
				cnt++;
			}
			answer[i] = cnt ;
		}
		return answer;
	}
}//class

제출 결과

2019-12-13 추가 풀이

: 복습하다 보니 처음에 너무 어렵게 푼 것 같다.. 프로그래머스의 다른 사람의 풀이를 참조하였다.

 

그냥 i번째 index부터 마지막 index까지 비교하면서, 현재 index보다 작은 값이 나오면 break 해준다.

 

그리고 떨어지지 않은 시간은 [ 이동한 위치의 index - 현재 index ]로 계산하면 쉽게 구할 수 있다.

 

1,3,3,3,0 이면

 

0번째 index 1의 값 처리할 때,

4번째 index 0의 값 일 때 떨어지고

 

4-0 하면 4초이다.

 

1번째 index 3의 값 처리할 때,

4번째 index 0의 값 일 때 떨어지고

 

4-3 하면 3초이다.

 

2번째 index 3의 값 처리할 때,

4번째 index 0의 값 일 때 떨어지고

 

4-2 하면 2초이다.

 

아래는 수정 한 최종코드이다. 간결하고 이해하기 쉽다..

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

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

		return answer;
	}

 

반응형