본문 바로가기
알고리즘/코딩 - 프로그래머스

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

by 주남2 2019. 6. 23.
반응형

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

생각

기본적인 정렬로는 안된다. 따라서 Comparator을 사용해서 새로운 정렬 기준을 만들어줘야 한다.

먼저 숫자의 합이 아닌 숫자로 된 문자들을 붙여서 만드는 것이므로 정수 배열을 문자 배열로 만들고 정렬을 해야 한다.

처음 생각한 것은 각 숫자들을 첫 번째부터 비교하여 큰 수가 앞에 오도록 만들었다. 하지만 그러다 보니 뒤의 문자에 대해서 제약 조건이 많아져서 40분을 넘게 쏟았으나 도저히 되지가 않았다..

 

따라서 좀 더 간단하게 생각하여 두 문자(a,b 라고 하자) 가 있으면, ab와 ba중 숫자가 더 큰 것이 큰 것으로 정렬되는 기준으로 만들었다.

 

그리고 문제를 풀면서 깨달은 것이 있는데, 모든 숫자가 0이라면 따로 처리를 해주지 않는다면 [0,0,0] 일 때, 000으로 나와 문제가 생긴다. 만약 모든 문자가 0이라면 0이 나오게 조건을 설정해 줘야 한다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
 
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        ArrayList<String> arr = new ArrayList<String>();
        
        for(int i=0; i<numbers.length; i++) {
            arr.add(String.valueOf(numbers[i]));
        }
        
        for(int i=0; i<arr.size(); i++) {
            if(!arr.get(i).equals("0")) {
                break;
            }
            
            if(i==arr.size()-1) {
                return "0";
            }
        }
        
        Collections.sort(arr, new Comparator<String>() {
 
            @Override
            public int compare(String arg0, String arg1) {
                
                return (arg1+arg0).compareTo(arg0+arg1);
            }
        });
                
        
        for(int i=0; i<arr.size(); i++) {
            answer += arr.get(i);
        }
        
        return answer;
   }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 

드디어 종강을 했다..ㅠㅠㅠㅠ 방학 때는 웹과 알고리즘을 열심히 할 예정이다. 부디 공부를 열심히 하길!!

반응형