[Java][프로그래머스] - LVL.0 최댓값 만들기(1)
정답 1
해당 문제를 처음 딱 봤을때 들었던 생각은!! 'sort 해서 끝에 두개 요소 가져와서 곱하기 시키면 되겠다!' 이다.
하지만 그렇게 문제를 풀면 재미가 없을것 같았다. 나는 이것도 stream 을 사용해 풀어보고 싶었다.
상당히 엉뚱한 생각이지만 그만큼 익숙해지고 잘 사용하고 싶은 욕심이였다.
import java.util.Arrays;
import java.util.stream.IntStream;
class Solution {
public int solution(int[] numbers) {
Arrays.sort(numbers);
int result = IntStream.of(numbers)
.filter((i) -> i >= numbers[numbers.length -2])
.reduce((x,y) -> x > 0 ? x * y : y)
.getAsInt();
return result;
}
}
해서 나는 문제를 상기와 같이 풀었다.
Arrays 로 sort 처리한 후 int 배열인 numbers 를 IntStream 반복자로 만들어 filter 로 끝에 두자리 숫자만 걸러낸뒤 reduce 사용해 걸러진 두자리 숫자가 곱해지도록 처리한 후 int 로 반환해 결과를 도출했다. 참 재밌었다.
결과는 정답이였다.
다른사람들은 어떻게 했을지 궁금해 찾아보았다.
정답 2
와 하나 찾았다..
import java.util.*;
class Solution {
public int solution(int[] numbers) {
numbers = Arrays.stream(numbers)
.boxed()
.sorted(Comparator.reverseOrder())
.mapToInt(Integer::intValue)
.toArray();
int answer = numbers[0] * numbers[1];
return answer;
}
}
이건 또다른 아주 재밌는 방식이었다.
먼저 int 배열인 numbers 를 boxed() 메서드를 통해 Stream 으로 만든 후 Comparator.reverseOrder() 를 사용해 배열의 순서를 뒤집었다. 여기서는 큰수부터 먼저 나열되도록 처리를 해준것이다. 그다음 mapToInt() 메서드를 사용해 Integer 요소들은 int 로 converting 해준뒤 int[ ] 배열로 반환시킨 후 제일 큰 수부터 나열된 이 배열에서 index 0 번과 1 번을 곱셈 연산한 것이다.
여기서 흥미로운점은 Comparator.reverseOrder();
이다. 스트림 정렬이라고 부른다.
참고로 Int[] 배열을 상대로 Comparator.reverseOrder() 를 사용하면 안된다. Stream<Integer> 나 Integer[] 배열을 대상으로만 사용 가능하다. 그래서 int[] 배열을 Stream<Integer> 로 boxed() 한뒤 sort(Comparator.reverseOrder()) 처리하여 내림차순으로 정렬조건을 바꾼 후 이 Stream<Integer> 을 int[] 배열로 바꿔준것이다.
정답 3
import java.util.*;
class Solution {
public int solution(int[] numbers) {
int answer = 0;
Arrays.sort(numbers);
return numbers[numbers.length-1]*numbers[numbers.length-2];
}
}
가장 무난한 정답 예시이다.
가장 무난하지만 가장 깔끔하다.
하지만 코드도 멋부릴줄 안다고,,, 너무 과하게 부리면 안되겠지만,,, 난 멋있어지고 싶다.
어쩌면 가장 위험한 생각일 수도ㅋㅋ,,
참고 :
https://ryan-han.com/post/dev/java-stream/
자바의 정석 - 스트림(Stream) | Integerous DevLog
자바의 정석 - 스트림(Stream) 2018/11/29 자바의 정석(남궁성 저) 2권 학습내용 정리 1. 스트림(Stream) 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았
ryan-han.com
. Arrays.sort(new Integer[] { ... } , Comparator.reverseOrder()); 사용 예시
https://ifuwanna.tistory.com/232
[Java] 배열(Array) 정렬 하기 ( 오름차순,내림차순 등 )
| Arrays.sort() java.util.Arrays 유틸리티 클래스를 사용하면 배열(Array)을 정렬, 복제하거나, List로 변환 하는 등의 작업을 쉽게 처리 할 수 있습니다. 해당 클래스의 sort() 메서드를 사용하면 쉽게 오름
ifuwanna.tistory.com
. int[ ] -> Integer[ ] 변환하는 방법
[java] Java에서 int []를 Integer []로 변환하는 방법? - 리뷰나라
나는 Java를 처음 접했고 매우 혼란 스러웠다. 길이가 4 인 큰 데이터 세트가 int[]있으며 4 개의 정수의 각 특정 조합이 발생하는 횟수를 계산하고 싶습니다. 이것은 문서에서 단어 빈도를 계산하
daplus.net
. Integer[ ] -> int[ ] 변환하는 방법
https://pangtrue.tistory.com/276
[Java] Integer[] -> int[] 로 변환하기
1. 개요 변환에는 크게 두 가지 종류가 있습니다. 자료구조의 변환. 예를 들어, List를 Integer[]로의 변환. (타입은 유지되고 자료구조만 변환하고 싶은 경우) 자료형의 변환. 예를 들어, int 타입을 In
pangtrue.tistory.com