문제
https://programmers.co.kr/learn/courses/30/lessons/42584
문제 풀이 .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값을 걸러낼 수 있다.
'Algorithm > Programmers' 카테고리의 다른 글
[Java | programmers] 정규표현식(regex) (0) | 2023.03.13 |
---|---|
[프로그래머스|최대공약수와 최소공배수] 유클리드 호제법 (0) | 2022.08.31 |
[프로그래머스|숫자 문자열과 영단어] replaceAll 함수 (0) | 2022.08.29 |
[프로그래머스] 모의고사 (0) | 2022.08.09 |
[프로그래머스]Level2 기능개발 <java> (0) | 2022.02.18 |