코딩 테스트/자료구조
[프로그래머스] 42746 가장 큰 수(Lv.2) - 정렬
토자맨
2024. 7. 5. 20:08
문제
numbers[]에 0 or 양의 정수가 주어졌을 때 정수를 이어 붙여서 만들 수 있는 가장 큰 수를 반환하라
코드
시도 1 - X
처음엔 단순하게 내림차순 정렬한 후 String으로 변환하여 출력하는 코드를 작성했다.
이 경우 [3, 30, 34]일 경우 34303이 되어 틀린 답이 나오게 된다.
/**
1. numbers 배열에서 크기 순서대로 정렬한다.
2. 정렬된 순서대로 이어 붙여 숫자를 만든다.
3. 반환한다.
**/
import java.util.Arrays;
class Solution {
public String solution(int[] numbers) {
Arrays.sort(numbers);
StringBuilder sb = new StringBuilder();
for (int num : numbers) {
sb.append(num);
}
String result = sb.toString();
return result;
}
}
시도 2 - O
아이디어를 떠올리지 못해서 다른 사람 코드를 참조했다...
정렬 할 때 두 요소의 값을 붙여서 비교한 후 더 큰 값의 앞 요소를 내림차순의 앞으로 보내는 방식이다.
예를 들어 A와 B가 있을 때 AB, BA를 비교한 후 AB가 더 크다면 내림차순 [A, B]
로 정렬하고 BA가 더 크다면 내림차순 [B, A]
로 정렬한다.
import java.util.Arrays;
class Solution {
public String solution(int[] numbers) {
// numbers[] 요소들을 String 형식으로 변환
String[] stnumbers = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
stnumbers[i] = String.valueOf(numbers[i]);
}
/** 두 값을 이어 붙여서 비교
1. 앞(o2+o1) > 뒤(o1+o2) = 음수 -> o1, o2 순서 그대로
2. 앞(o2+o1) < 뒤(o1+o2) = 양수 -> o1, o2 순서 바꿔서(o2, o1)
3. 앞(o2+o1) == 뒤(o1+o2) = 0 -> o1, o2 순서 그대로
즉, compareTo()의 반환값이 음수 or 0이면 순서 그대로(o1, o2), 양수면 순서 바꿔서(o2, o1)
*/
Arrays.sort(stnumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
// numbers[]의 모든 수가 0일 경우 "0" 반환
if (stnumbers[0].equals("0")) {
return "0";
}
// Strinng 배열인 stnumbers[]의 요소들을 하나의 String으로 만들기
StringBuilder sb = new StringBuilder();
for (String num : stnumbers) {
sb.append(num);
}
return sb.toString();
}
}
- numbers[] 요소들을 String 형식으로 변환한다
String[] stnumbers = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
stnumbers[i] = String.valueOf(numbers[i]);
}
- 두 요소를 비교하여 내림차순으로 정렬한다.
/** 두 값을 이어 붙여서 비교
1. 앞(o2+o1) > 뒤(o1+o2) = 음수 -> o1, o2 순서 그대로
2. 앞(o2+o1) < 뒤(o1+o2) = 양수 -> o1, o2 순서 바꿔서(o2, o1)
3. 앞(o2+o1) == 뒤(o1+o2) = 0 -> o1, o2 순서 그대로
즉, compareTo()의 반환값이 음수 or 0이면 순서 그대로(o1, o2), 양수면 순서 바꿔서(o2, o1)
*/
Arrays.sort(stnumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
- 만약 numbers[]의 모든 요소가 0이라면 "0"을 반환한다.
if (stnumbers[0].equals("0")) {
return "0";
}
- 내림차순 정렬된 String 배열의 요소들을 하나의 String 값으로 변환하여 반환한다.
StringBuilder sb = new StringBuilder();
for (String num : stnumbers) {
sb.append(num);
}
return sb.toString();