코딩테스트/프로그래머스
[코딩테스트] Java 가장 큰 수
[dev] hiro
2024. 11. 12. 00:54
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.
포인트
각 자릿수를 토대로 비교하면서 가장 큰 수를 구할 수도 있겠습니다만, 시간 초과가 날 것입니다.
이를 위해 문자열 정렬로 생각하여 문제를 풀었습니다. 예를 들어, a = "3"와 b = "30"일 때 (b + a)는 "303"이고 (a + b)는 "330"입니다. 따라서 "330"이 더 앞에 오도록 구현하였습니다.
소스코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
StringBuilder sb = new StringBuilder();
String[] strNumbers = Arrays.stream(numbers)
.mapToObj(String::valueOf)
.toArray(String[]::new);
Arrays.sort(strNumbers, (a, b) -> (b + a).compareTo(a + b));
for (String num : strNumbers) {
sb.append(num);
}
if (sb.toString().charAt(0) == '0') {
return "0";
}
return sb.toString();
}
}
코드 설명
- StringBuilder sb = new StringBuilder();
문자열을 효율적으로 생성하기 위해 StringBuilder 객체 sb를 생성합니다. 최종 결과 문자열을 생성하는 데 사용됩니다. - String[] strNumbers = Arrays.stream(numbers).mapToObj(String::valueOf).toArray(String[]::new);
numbers 배열의 각 요소를 문자열로 변환하여 새로운 String 배열 strNumbers에 저장합니다.
- Arrays.stream(numbers): numbers 배열을 스트림으로 변환합니다.
- .mapToObj(String::valueOf): 각 정수 요소를 String 객체로 변환합니다.
- .toArray(String[]::new): 스트림의 결과를 String 배열로 반환합니다.
- Arrays.sort(strNumbers, (a, b) -> (b + a).compareTo(a + b));
strNumbers 배열을 사용자 정의 비교자로 정렬합니다.
- 정렬 기준을 문자열 (a + b) 와 (b + a)의 비교로 결정합니다.
- (b + a).compareTo(a + b): 두 연결 결과를 비교하여 내림차순으로 정렬합니다.
- if (sb.toString().charAt(0) == '0') { return "0"; }
생성된 문자열이 0으로 시작하는 경우, 이는 numbers 배열의 모든 요소가 0일 때입니다. 따라서 "0"을 반환합니다. - return sb.toString();
StringBuilder에 추가된 모든 요소를 문자열로 변환하여 반환합니다.