본문 바로가기
Memo/코테

[프로그래머스] 가장 큰 수 (람다와 Stream 활용)

by 연로그 2021. 10. 27.
반응형

가장 큰 수(java)

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

입출력 예

numbersreturn

[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr


풀이 1

class Solution {
    public String solution(int[] numbers) {
        String[] arr = convertIntArrToStringArr(numbers);

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s2+s1).compareTo(s1+s2);
            }
        });

        if("0".equals(arr[0])) return "0";
        return convertArrToString(arr);
    }

    public String convertArrToString(String[] arr) {
        StringBuilder sb = new StringBuilder();
        for(String a: arr) {
            sb.append(a);
        }
        return sb.toString();
    }

    public String[] convertIntArrToStringArr (int[] intArr) {
        int len = intArr.length;
        String[] strArr = new String[len];
        for(int i=0;i<len;i++) {
            strArr[i] = Integer.toString(intArr[i]);
        }
        return strArr;
    }
}
  1. int[]를 String[]으로 변환
  2. String[]를 정렬
  3. String[]을 String 형태로 변환

 

위 코드로도 통과는 하지만 이를 java 라이브러리를 적극 사용하도록 개선해보겠다.

우선 정렬하는 부분을 살펴보자.

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return (s2+s1).compareTo(s1+s2);
    }
});

Comparator의 compare 메소드를 오버라이드하여 내가 원하는 기준으로 정렬시켰다.

이 부분을 람다를 활용하면 더 간략화할 수 있다.

 

Arrays.sort(arr, (s1, s2) -> { return (s2+s1).compareTo(s1+s2); });

Java는 Arrays.sort()의 두번째 인자에 대해서 Comparator가 올 것이라고 이미 알고있다.

Comparator 선언부터 compare 메소드명까지 생략이 가능하다.

 

arr가 String[]이므로 파라미터도 String형태가 올 것임을 예상하고 생략했다.

 

여기서 더 간략화해보자.

Arrays.sort(arr, (s1, s2) -> (s2+s1).compareTo(s1+s2));

복잡한 식 없이 s1와 s2의 비교에 대한 연산만 return했으니 아예 이 부분도 생략해줬다.

 

람다식을 활용해 정렬 부분의 코드가 깔끔해진 것을 확인할 수 있다.

스트림을 활용하면 위 코드 전체를 깔끔하게 만들 수 있다.

 

class Solution {
    public String solution(int[] numbers) {
        String answer = IntStream.of(numbers)
                                .mapToObj(String::valueOf)
                                .sorted((s1, s2) -> (s2+s1).compareTo(s1+s2))
                                .collect(Collectors.joining());
        if(answer.startsWith("0")) return "0";
        return answer;
    }
}
  1. IntStream.of(arr) 배열을 int stream으로 변환
  2. mapToObj(String::valueOf) 각 요소에 대해 String.valueOf(요소) 반환
  3. sorted() 정렬
  4. collect(Collectors.joining()) 배열의 각 요소 붙이기

 

기존 코드를 stream으로 바꾸면서 String[]이 없어졌다.

배열의 첫 요소가 0인지 검사하던 코드를 answer이 0으로 시작하는지 확인하는 코드로 수정했다.

 

 

 

때에 따라 적당한 경우가 다르겠지만 Stream을 활용하면 코드가 정말 보기 편해지는 것 같다.

Stream 더보기 -> https://yeonyeon.tistory.com/74

 

[Java Stream] 자바 스트림

스트림; Stream 데이터의 흐름 java 8에서 추가한 람다를 활용할 수 있는 기술 중 하나 배열 / 컬렉션 인스턴스에 함수 여러 개를 조합해 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 한

yeonyeon.tistory.com

 

반응형

'Memo > 코테' 카테고리의 다른 글

[백준] 스도쿠  (0) 2021.11.22
[프로그래머스] 10주차 위클리  (0) 2021.10.13
[프로그래머스] 2개 이하로 다른 비트  (2) 2021.10.07
[백준] 1152번: 단어의 개수  (0) 2021.10.06
백준 - 빗물 (JAVA)  (0) 2021.10.01