문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
문제 풀이
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] str = new String[numbers.length];
int i = 0;
for(int s : numbers){
str[i] = String.valueOf(numbers[i]);
i++;
}
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String s1, String s2){
return (s2 + s1).compareTo(s1 + s2);
}
});
if(str[0].equals("0"))
return "0";
for(String t : str){
answer += t;
}
return answer;
}
}
- numbers 배열 길이만큼 str 배열 생성
- for-each 반복문 String.valueOf 사용하여 int -> String 변환
- 내림차순으로 정렬
- 일반적인 내림차순 정렬은 2번째 예의 3과 30이 "330"이 아닌 "303"이 된다.
- Comparator를 사용하여 문자열을 붙여서 판단 후 내림차순 정렬이 필요하다.
- a.compareTo(b)
- 내림차순 : (s2+s1).compareTo(s1+s2);
- 오름차순 : (s1+s2).compareTo(s1+s2);
- 앞에서부터 비교하다 다른 문자열이 나오면 'a-b' 순서로 해당 문자의 아스키코드 값을 뺀 결과(int)를 리턴 - 0 값이 중복일 경우 ex) {0, 0, 0} 답이 000이 나오면 안 되므로 첫 번째 값이 0이면 0을 리턴
- 첫번째 값이 0이 아닐 경우 answer 변수에 문자열을 더해 리턴
다른 사람의 풀이
Lambda, Stream, Collections를 사용하여 훨씬 깔끔해진 코드들이다.
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
answer = Arrays.stream(numbers)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> -s1.concat(s2).compareTo(s2.concat(s1)))
.reduce("", (s1, s2) -> s1.equals("0") && s2.equals("0") ? "0" : s1.concat(s2));
return answer;
}
}
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
public String solution(int[] numbers) {
List<String> result = Arrays.stream(numbers).mapToObj(n -> String.valueOf(n)).collect(Collectors.toList());
Collections.sort(result, (s1, s2) -> (s2+s1).compareTo(s1+s2));
if(result.get(0).equals("0")) {
return "0";
}
return result.stream().collect(Collectors.joining());
}
}