본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)/코딩 테스트 & 알고리즘

5. 주식가격 (프로그래머스, 스택/큐 Level 2)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 10. 16.

* 문제 설명
 - 초 단위로 기록된 주식가격이 담긴 배열 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은 끝까지 가격이 떨어지지 않았습니다.
 - 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
 - 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
 - 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
 - 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

 

스택/큐와 관련된 첫번째 파트입니다.

문제 내용에서의 핵심은 자기를 중심으로 다른 값과 비교하는 것 입니다.

비교를 하려면 가장 쉬운 방법은 역시나 반복문 입니다.

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

	
    public static int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        for(int i = 0 ;i < prices.length; i++){  //반복문을 동작 시킵니다.
        
        }
        return answer;
    }

 

이렇게 하면 반복문이 동작하면서 자기 차례가 돌아오는 기능은 완성 되었습니다.

주어진 샘플배열인 prices값에서 2가지 값을 살펴보겠습니다.

prices[0] 값은 숫자 1이며, prices[1]의 값은 숫자 2입니다.

prices[0] 값은 출발 지점을 0부터 해서 마지막 값 까지 비교를 하면 됩니다.

그러나 prices[1] 값은 출발 지점이 1부터 되어야 합니다. 왜냐하면 이전 기록은 비교대상이 아니기 때문입니다.

위 내용을 토대로 반복문을 수정하여 보면,

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

	
    public static int[] solution(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++){  //시작값을 1 증가시킵니다.
            
            }
        }
        return answer;
    }

 

나 자신을 비교할 필요가 없으며, 지나간 값을 비교할 필요가 없으므로 내부 반복문의 시작값을 동작하는 반복문의 인덱스 값인 i에 1을 더해 주었습니다.

이제 남은 것은 값을 비교하여 주면서 크기여부를 판단한 뒤에 본인보다 크면 중지시켜 해당 값을 결과에 기록하는 것 입니다.

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

	
    public static int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        for(int i = 0 ;i < prices.length; i++){  //반복문을 동작 시킵니다.
            int myNumber = 0;
            //비교를 위한 반복문 추가 부분,
            loop : for(int j = i+1 ;j < prices.length; j++){  //시작값을 1 증가시킵니다.
                myNumber = j-i; //증가값
                if(prices[i] > prices[j]){  //비교
                    break loop;
                }                
            }
            answer[i] = myNumber;
        }
        return answer;
    }

 

두근거리는 마음으로 결과를 제출하여 봅니다..

통과입니다!

 

한번에 통과해서 나름 기분이 참 좋았던 것 같습니다..^^;

그럼 다음문제로 넘어가겠습니다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글