문제 설명
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
|
드디어 종강을 했다..ㅠㅠㅠㅠ 방학 때는 웹과 알고리즘을 열심히 할 예정이다. 부디 공부를 열심히 하길!!
'알고리즘 > 코딩 - 프로그래머스' 카테고리의 다른 글
[Java][프로그래머스][Level 2] 다리를 지나는 트럭 (0) | 2019.07.10 |
---|---|
[Java][프로그래머스][Level 1] 완주하지 못한 선수 (0) | 2019.07.02 |
[Java][프로그래머스][Level 2] 행렬의 곱셈 (0) | 2019.05.29 |
[Java][프로그래머스][Level 2] 피보나치 수 (0) | 2019.05.28 |
[Java][프로그래머스][Level 2] 최솟값 만들기 (0) | 2019.05.27 |