본문 바로가기

algorithm

가장 큰 수

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

 

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

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

programmers.co.kr

오늘 푼 문제는 '가장 큰 수'라는 문제였다.


풀이

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Solution {
    class StrComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            int sum1 = Integer.parseInt(o1 + o2);
            int sum2 = Integer.parseInt(o2 + o1);
            if(sum1 > sum2) return -1;
            else if(sum1 == sum2) return 0;
            else return 1;
        }
    }

    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        List<String> list = Arrays.stream(numbers).mapToObj(i -> i + "")
        		.sorted(new StrComparator()).collect(Collectors.toList());
        list.forEach(n -> answer.append(n));
        return answer.charAt(0) == '0'?"0":answer.toString();
    }
}

입력받은 숫자배열을 내가 직접 만든 StrComparator 클래스를 이용해 정렬하여 List<String> Type으로 바꿔준다.
그 후 배열을 반복하며 StringBuilder 객체인 answer에 한 글자씩 추가하면 된다.
0일 경우에는 "0" 한 글자만 반환해야 하므로 첫 번째 글자가 0일 경우에는 "0"을 반환해주도록 코드를 작성했다.

 

이 코드에서 가장 중요한 부분은 어떤 방식으로 정렬을 했느냐라고 생각한다.

compare 함수를 보면, o1과 o2를 문자열 상태로 합쳐준 후 int로 바꿔준다.
그리고 sum1이 sum2보다 [클 경우 o1이 작다는 뜻으로 -1을, 같을 경우에는 0을, 작을 경우에는 1을 반환해준다.]
여기서 sum1이 더 큰 숫자인데, 왜 o1이 더 작다는 뜻의 -1을 반환해야하는지 의문을 가질 수 있다.
sum1이 더 크다는 뜻은 최종문자열을 만들 때 o1 문자열이 먼저 와야 된다는 것이다.
즉, o2에 비해 배열의 앞쪽 인덱스에 위치해야 하는 것이다. 따라서 o1이 더 작다는 뜻의 -1을 반환해서 앞쪽 인덱스로 당겨오는 것이다.


압축

오늘도 설명이 부족한 거 같지만, ㅠㅠㅠ 이해해주길 바란다!!!
Comparator나 Stream 관련해서는 직접 찾아보도록 하자!!!! 참고로 코드는 이런 식으로 하면 같은 코드를 훨씬 압축시켜서 짤 수 있다.
(물론 코드를 압축시키는 것만이 능사는 아니지만, 위나 아래나 성능은 별 차이 없다는 것은 확실하다.)

import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        Arrays.stream(numbers).mapToObj(i -> i + "")
                .sorted((o1, o2) -> {
                    int sum1 = Integer.parseInt(o1 + o2);
                    int sum2 = Integer.parseInt(o2 + o1);
                    return sum1 > sum2?-1:sum1==sum2?0:1;
                }).collect(Collectors.toList())
                .forEach(n -> answer.append(n));
        return answer.charAt(0) == '0'?"0":answer.toString();
    }
}

 

'algorithm' 카테고리의 다른 글

백준 1065 - 한수  (0) 2021.09.16
카펫  (0) 2021.04.11
소수 찾기  (0) 2021.04.10
H-Index  (0) 2021.04.10
K번째 수  (0) 2021.04.07