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

 

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

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

programmers.co.kr

 

숫자들을 입력받아서 사전순으로 정렬해서 가장 큰 수를 만들면 되는 간단한 문제라고 생각하였으나,

0~1000 까지 입력 받을 수 있고, 숫자들을 문자열로 변환한 후에 최소 4자 이상 늘린다음, 문자열 비교를 해야 정렬이 된다.

그리고 실행하다보면, 테스트11에서 계속 막히는데 이유는 배열의 모든 값이 0인 경우에는 0을 리턴해야 한다.

 

(예제 코드)

  • 단순 값으로는 정렬이 어려워서 Collections.sort 를 사용하여 별도의 정렬 과정을 진행하였습니다.
  • mapToObj 사용한 이유는 int array 자체를 string array 로 변환하고자 사용하였습니다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
    public static String solution(int[] numbers) {
        int sum = Arrays.stream(numbers).sum();
        if (sum == 0) return "0";
        String[] strNumbers = Arrays.stream(numbers).mapToObj(String::valueOf).toArray(String[]::new);
        List<String> orderedList = Arrays.stream(strNumbers)
                .collect(Collectors.toList());
        Collections.sort(orderedList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                String newO1 = o1 + o1 + o1 + o1;
                String newO2 = o2 + o2 + o2 + o2;
                return newO2.substring(0,4).compareTo(newO1.substring(0,4));
            }
        });

        String answer = "";
        for (String item : orderedList) {
            answer += item;
        }
        return answer;
    }
}

+ Recent posts