본문 바로가기
알고리즘/문제 풀이

프로그래머스: 가장 큰 수

by 위대한초밥V 2023. 10. 18.

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

설명

이 문제를 처음에 봤을 때, 숫자의 가장 상위에 있는 자릿수를 비교하여 정렬하려고 생각했다. 

하지만 이 경우 3, 30, 34처럼 일의 자리 숫자와 십의 자리 숫자가 함게 있는 경우(즉 서로 다른 자릿수를 갖는다면) 이 다음 자릿수를 비교해야 한다.

따라서 이 문제는 숫자를 문자로 바꾸고 사전 정렬해서 풀면 된다. 

 

// 숫자들을 저장하는 String 배열을 만들어, 문자들을 숫자로 바꾸고 저장한다.

String[] num = new String[numbers.length];

for(int i = 0; i < numbers.length; i++) {
            num[i] = String.valueOf(numbers[i]);
            if(numbers[i] != 0) {
                allZero = false;
            }
}
        

// 저장된 배열을 Comparator를 이용해 정렬한다.

Arrays.sort(num, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {

                // 비교하는 숫자들은 순서로 조합해서 확인한다.(6, 10이라면 610 또는 106을 비교)
                return (o2 + o1).compareTo(o1 + o2);  
            }
});

 

+) 배열에 0만 담길 경우를 고려해야 한다. 0으로만 구성되어 있다면 answer = 0이 되고 종료한다.

코드

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        String[] num = new String[numbers.length];
        boolean allZero = true;
        
        for(int i = 0; i < numbers.length; i++) {
            num[i] = String.valueOf(numbers[i]);
            if(numbers[i] != 0) {
                allZero = false;
            }
        }
        
        Arrays.sort(num, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });
        
        for(String n : num) {
            answer += n;
        }
        
        if(allZero) {
            answer = "0";
        }
        
        return answer;
    }
}
반응형