본문 바로가기
Algorithm/Programmers

[프로그래머스]Level2 주식가격<java>

by 수짱수짱 2022. 2. 18.

문제

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

 

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

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

programmers.co.kr

 

문제 풀이 .java

 

import java.util.*;

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = {};
        List<Integer> answers = new ArrayList<>();
        
        for (int i = 0; i < prices.length; i++) {
            
            if(i == prices.length -1 ) {
                answers.add(0);
                break;
            }

            int count = 0;

            for (int j = i+1; j < prices.length; j++) {
                if(prices[i] > prices[j]){
                    answers.add(++count);
                    break;
                }
                count += 1;

                if(j == prices.length-1) answers.add(count);
            }

        }

        answer = answers.stream().mapToInt(i -> i).toArray();
        return answer;
    }
}

 

 

풀이

 

        for (int i = 0; i < prices.length; i++) {
            
            if(i == prices.length -1 ) {
                answers.add(0);
                break;
            }

            int count = 0;

            for (int j = i+1; j < prices.length; j++) {
                if(prices[i] > prices[j]){
                    answers.add(++count);
                    break;
                }
                count += 1;

                if(j == prices.length-1) answers.add(count);
            }

        }

여기가 날짜 count 하는 부분이다. 가격이 떨어지지 않은 기간을 count하므로 같은 가격은 count하지 않는다.

 

price.length - 1과 i 를 비교하는 구문은 배열의 마지막임을 알려주고 마지막에 count한 값을 배열에 넣어주기 위함이다. 마지막 인덱스의 가격은 비교할 수 없으므로 0으로 고정이다. 이 비교문이 있으므로 i는 length-1이 아닌 length까지 반복한다. (어차피 i+1 가기전에 break 되니깐)

 

price.length - 1과 j 를 비교하는 구문은 이때까지 count한 값을 배열에 넣어주기 위함이다.

 

j변수 for문의 안에 뒷 배열의 가격이 i 인덱스 보다 작다면 count를 배열에 넣어주는데 그냥 넣어주면 비교한 값이 들어가지 않고 그 전에 count된 값만 들어가므로 전위 연산으로 count해주는 것이다. 

 

 

        answer = answers.stream().mapToInt(i -> i).toArray();
        return answer;

 

stream을 통해 Integer를 자바가 자동으로 int형으로 바꿔주어 ArrayList를 배열형태로 만든다. 

 

mapToInt(Integer::intValue)로도 가능한데 이 방식은 intValue 메소드를 통해 각 요소를 int형으로 변경하는 것이다.

위에서 내가 사용한 방식은 자바가 자동으로 각 Integer 요소를 int형으로 변환(unboxing)해주는 것이다. 

참고로, 중간 연산으로 filter(i -> i != null)을 통해 null값을 걸러낼 수 있다.