가장 큰 수

하루히즘·2021년 6월 16일
0

프로그래머스

목록 보기
15/17

설명

프로그래머스의 가장 큰 수 문제다.

이전에 작성한 파이썬 풀이와 동일한 문제다.

풀이

이전에 문제 해설을 찾아볼 때 파이썬 뿐 아니라 자바 풀이도 본 적이 있어 이를 기반으로 풀어보았다.

파이썬에서는 문자열을 비교하는 방법을 지정할 수 없어서 문자열을 여러 번 이어붙이고 비교했지만 자바에서는 대부분의 정렬 메서드에서 Comparator 구현체를 받아 정렬 방법을 사용자가 직접 명시할 수 있다.

그래서 풀이에서는 Arrays 클래스의 sort 메서드에 파라미터로 두 수를 앞뒤로 조합한 후 비교하는 Comparator 구현체를 넘겨서 활용할 수 있었다.

이를 기반으로 작성한 코드는 다음과 같다.

import java.util.*;


class Solution {
    public String solution(int[] numbers) {
        // https://stackoverflow.com/questions/880581/how-to-convert-int-to-integer-in-java
        // Comparator에서 int를 비교하기 위해 int 배열을 Integer 배열로 변환.
        Integer[] numbersBoxed = Arrays.stream(numbers).boxed().toArray(Integer[]::new);
        // 구현된 Comparator를 이용한 Integer 배열 정렬.
        Arrays.<Integer>sort(numbersBoxed, new Comparator<Integer>() {
            @Override
            public int compare(Integer value1, Integer value2) {
                // "정수 1 + 정수 2" 조합과 "정수 2 + 정수 1" 조합을 비교.
                return Integer.valueOf(String.format("%d%d", value2, value1)).
                    compareTo(Integer.valueOf(String.format("%d%d", value1, value2)));
            }
        });
        
        // 정렬된 정수들을 하나의 문자열로 병합.
        StringBuilder builder = new StringBuilder();
        for(int number: numbersBoxed) {
            builder.append(number);
        }
        String output = builder.toString();
        // 모든 정수가 0인 경우 "0000"처럼 병합되기 때문에 예외처리.
        return output.charAt(0) == '0' ? "0" : output;
    }
}

후기

코딩 테스트는 항상 파이썬이 간편하고 더 이해하기 쉽다는 착각에 빠져 있던 나를 정신차리게 해준 문제였다. 생각하기도 힘든 풀이의 파이썬보다 이렇게 Comparator로 정렬 방식을 커스텀하는 것이 더 이해하기도 쉽고 직관적이었다.

물론 파이썬으로도 어떤 간편한 풀이나 정렬 방식을 지정할 수 있는 방법이 있다고 생각하지만 현재 수준에서는 자바 풀이가 더 맘에 든다.

참고

자바 풀이 원본

profile
YUKI.N > READY?

0개의 댓글