- 프로그래머스 / 정렬 / 가장 큰 수 -
문제설명
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" |
풀이과정
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] strNumbers = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
strNumbers[i] = Integer.toString(numbers[i]);
}
Arrays.sort(strNumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
for (String strNumber : strNumbers) {
answer += strNumber;
}
if (answer.charAt(0) == '0') return "0";
return answer;
}
}
풀이 과정
1. int 형인 numbers 배열의 원소들을 String 타입으로 변경하여 strNumbers 배열에 삽입
2. compareTo 메서드를 사용하여 strNumbers 배열 정렬
3. 정렬된 strNumbers 배열의 원소를 answer 에 추가
회고
public class Practice {
public static void main(String[] args) {
String[] arr1 = {"3", "34", "31"};
Arrays.sort(arr1, Comparator.reverseOrder()); // 결과 : 34, 31, 3
String[] arr2 = {"3", "34", "31"};
Arrays.sort(arr2, (o1, o2) -> (o2 + o1).compareTo(o1 + o2)); // 결과 : 34, 3, 31
}
}
- 초기에는 위와 같은 단순 String 정렬을 실시하였으나 1번째 자릿수가 같은 수의 경우 뒤에 자릿수까지 비교를 하지 않고 31 > 3 인 이유로 정렬이 34, 31, 3 순으로 정렬됨.
- compareTo 메서드를 활용하여 두 수의 조합으로 더 큰 수를 만들어 내는 방식을 알 수 있었음.
- Just Do It -
반응형
'CodingTest' 카테고리의 다른 글
[Java] H-index (0) | 2022.04.20 |
---|---|
[Java] K번째 수 (0) | 2022.04.18 |
[Java] 베스트 앨범 (0) | 2022.04.02 |
[Java] 전화번호 목록 (0) | 2022.04.02 |
[Java] 완주하지 못한 선수 (0) | 2022.04.02 |