ALGORITHM/PROGRAMMERS

[프로그래머스] 가장 큰 수

0298 2021. 8. 2. 12:07

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

 

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

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

programmers.co.kr

2021-08-02


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        String[] arr = new String[numbers.length];
 
        for(int i = 0; i < numbers.length; i++) arr[i] = String.valueOf(numbers[i]);
 
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2); //내림차순
            }
        });
 
        if(arr[0].equals("0")) return "0";
        for(String str: arr) answer.append(str);
        return answer.toString();
    }
}
cs

#문제풀이

문제를 대충 봤을 때 그냥 다 돌려야지 생각했었다;  그냥 돌리면 터진다... 

다행히도? 규칙을 발견했는데, 숫자를 숫자로 보면 안되고 문자로 봐야한다. 

 

1번 예제 같은 경우, [6, 10, 2] 인데 숫자로 보면 당연히 10 > 6 > 2 지만 문자로 보면 6 > 2 > 10 으로 둘 수 있다. 

 

2번 예제 같은 경우, [3, 30, 34, 5, 9] 인데 9 > 5 는 명확한데 34, 30, 3은 어떻게 정렬해야할지 고민이 됐다.

결론적으로는 34 > 3 > 30으로 정렬이 되는데, 이는 두 문자열을 더해보면 된다. 

 

[34, 3] 의 경우 : 34+3 = 343 or 3+34 = 334 이니깐, 34 > 3 으로 정렬 된다.

 

[3, 30]의 경우 : 3 + 30 = 330 or 30 + 3 = 303 이니깐, 3 > 30 으로 정렬 된다.

 

내림차순으로 정렬해야해서 o2.compareTo(o1)을 리턴하면 된다. (대신 덧셈(o2+o1)으로 표현)

 

+) 11번 테스트 케이스 틀렸는데 전부 0인 경우 [0, 0, 0, 0]를 생각을 못했다; ;

정렬 후 첫번째값이 0이 나오면 전부 0이라는 의미이므로 그냥 "0"을 리턴하면 된다.