https://school.programmers.co.kr/learn/courses/30/lessons/42746
문제 설명
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" |
풀이의 키포인트
1. Arrays.sort() 내부에서 Comparator의 compareTo()를 이용하는 방식을 이용해 한 줄짜리 가독성 좋은 코드를 작성 가능했다.
Arrays.sort(arr,(o1,o2) -> (o2+o1).compareTo(o1+o2));
: 두 String값을 이어붙였을때, 큰값이 왼쪽에 오도록 sorting (내림차순)
Arrays.sort(arr,(o1,o2) -> (o1+o2).compareTo(o2+o1));
: 두 String값을 이어붙였을때, 큰값이 오른쪽에 오도록 sorting (오름차순)
참고)
https://yuja-kong.tistory.com/172
https://ifuwanna.tistory.com/232
2. 정렬된 숫자를 이어붙이는 경우 String 값을 더하는 것보다 StringBuilder 이용해 append()하는 것을 추천한다.
이유는 String의 Immutable에 대해 리서치해보면 알 수 있다. 어쨌든 String을 합치는 연산이 많을수록 StringBuilder가 유리하다.
이 String 객체끼리 더하는 방법은 메모리 할당과 해제를 발생시키는데, 덧셈 연산이 많아진다면 성능적으로 좋지 않다.
관련 내용은 아래 링크에 설명되어 있다.
자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다. 따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.
참고)
https://www.codejava.net/java-core/the-java-language/why-use-stringbuffer-and-stringbuilder-in-java
코드
import java.util.Arrays;
class Solution {
public String solution(int[] numbers) {
String[] arr = new String[numbers.length];
for(int i=0; i<numbers.length;i++){
arr[i] = String.valueOf(numbers[i]); //String 타입의 배열로 변경
}
Arrays.sort(arr,(o1,o2) -> (o2+o1).compareTo(o1+o2)); //내림차순 정렬
if(arr[0].equals("0")){
return "0";
}
StringBuilder answer = new StringBuilder();
for(int i=0;i<arr.length;i++){
answer.append(arr[i]);
}
return answer.toString(); //StringBuilder 객체의 경우 .toString()으로 문자열로 만들어줘야 함
}
}
[참고]
https://yuja-kong.tistory.com/172
https://ifuwanna.tistory.com/232
https://onlyfor-me-blog.tistory.com/317
'코딩테스트 > 정렬' 카테고리의 다른 글
[2차원 배열 서로 다른 기준으로 정렬] 인사고과 (0) | 2024.04.04 |
---|---|
Comparator, Lamda 사용하여 2차원 배열 정렬하기 (0) | 2024.02.20 |
Arrays.sort( ) - String 타입 / Integer 타입 (0) | 2024.02.15 |