프로그래머스 - 코딩테스트

[Java][프로그래머스] - LVL.0 최댓값 만들기(1)

Denny Code 2023. 1. 25. 00:28


정답 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[ ] 변환하는 방법

http://daplus.net/java-java%EC%97%90%EC%84%9C-int-%EB%A5%BC-integer-%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/

 

[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