0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
| numbers | return |
|---|---|
| [6, 10, 2] | "6210" |
| [3, 30, 34, 5, 9] | "9534330" |
배열로 주어진 수들을 temp 리스트로 옮기고 그 중 가장 큰 수를 찾아, list 리스트에 넣는다.
- 이 과정에서 잦은 추가와 삭제가 예상되어 배열이 아닌 리스트로 접근하였다.
arrayToList() : 배열을 리스트로 복사하는 메서드
addMaxNum() : 가장 큰 수를 찾아 list 리스트에 넣는다.
- 가장 큰 수는 자리수에 상관 없이 첫번째 자리 수가 가장 큰 수를 고른다.
import java.util.ArrayList;
import java.util.List;
class Solution {
private int maxNumber;
private final List<Integer> list = new ArrayList<>();
private final List<Integer> temp = new ArrayList<>();
public String solution(int[] numbers) {
arrayToList(temp, numbers); //배열을 리스트로 복사
while (!temp.isEmpty()) { //temp 리스트가 빌 때까지
maxNumber = temp.get(0);
for (int i = 1; i < temp.size(); i++) {
int digit = temp.get(i) / 10;
addMaxNum(maxNumber, temp.get(i), digit, i); //최대 수를 판단하여 리스트에 추가
}
}
String answer = list.toString();
return answer;
}
private final void arrayToList(final List list, final int[] array) {
for (int a : array) {
list.add(a);
}
}
//각 숫자의 맨 첫 자리수 크기를 비교
//3과 23을 비교할 경우 3 * 10과 23을 비교
//단, 이 경우 [34, 3, 5]가 있을 경우 "5343"이 아닌 "5334"로 배치될 수도 있어 문제가 발생
private final void addMaxNum(final int currentMax, final int num, final int digit, final int index) {
if (digit < 1) { //1자리수
if (currentMax < num) {
maxNumber = num;
temp.remove(index);
list.add(maxNumber);
}
} else if (digit < 10) { //2자리수
if (currentMax * 10 < num) {
maxNumber = num;
temp.remove(index);
list.add(maxNumber);
}
} else if (digit < 100) { //3자리수
if (currentMax * 100 < num) {
maxNumber = num;
temp.remove(index);
list.add(maxNumber);
}
} else if (digit == 1000) {
if (currentMax * 1000 < num) {
maxNumber = num;
temp.remove(index);
list.add(maxNumber);
}
}
}
}
//int a가 0~9이면 a / 10 = 0; -> 1미만이면 1자리수
//10~99면 1~9; -> 10미만이면 2자리수
//100~999면 10~99; -> 100미만이면 3자리수
가장 큰 수를 고르는 과정에서 3과 31을 구분하지 못하였고, 이를 보완하려면 마지막 자리 수까지 비교하도록 하는 과정이 필요했다. 다만, 이는 효율성을 만족하지 못한다. (시간 초과)
Comparator 인터페이스의 compare() 메서드를 오버라이딩한다.Arrays.sort()를 통해 정렬된 stringNumbers로부터 향상된 for문을 이용해 하나씩 str에 저장한다.import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
class Solution2 {
public String solution(int[] numbers) {
String answer = "";
String[] stringNumbers = new String[numbers.length];
for (int i = 0; i < stringNumbers.length; i++) {
stringNumbers[i] = String.valueOf(numbers[i]);
}
Arrays.sort(stringNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
System.out.println((o2+o1) + "과 " + (o1+o2) + " 비교");
return (o2+o1).compareTo(o1+o2);
}
});
for (String str : stringNumbers) { //정렬된 순서대로 answer에 추가
answer += str;
}
if (stringNumbers[0].equals("0")) { //배열이 {0, 0, 0} 처럼 0으로만 주어질 경우 0을 리턴
return "0";
}

return answer;
}
}
가장 큰 수를 찾는 과정이 간단해져 정렬에 시간을 뺏기지 않았다.