https://school.programmers.co.kr/learn/courses/30/lessons/42746
이 문제는 정렬 문제이다.
입력으로 int 배열이 들어오는데, 이때 이 배열을 조합해서 가장 큰 수를 만들면 되는 간단한 문제이다.
핵심
정렬 조건을 재정의하여 우리가 원하는 조건으로 정렬시키는 것이 중요하다.
정답 코드
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String solution(int[] numbers) {
String[] str = new String[numbers.length];
for (int i = 0; i <str.length;i++){
str[i] = String.valueOf(numbers[i]);
}
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2);
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length; i++){
sb.append(str[i]);
}
return sb.charAt(0)=='0'?"0":sb.toString();
}
}
해설
String 배열로 바꾼뒤, 그 배열을 정렬시킨다.
정렬 조건의 경우 String으로 치환해서
s1+s2와 s2+s1간의 크기를 비교해서 사전순으로 누가 뒤에 있는지를 따지는 것이다.
저 정렬을 사용하면 입력 값이 6, 10, 2라면 -> 6, 2, 10으로 된다.
이후 차례대로 StringBuilder에 추가시킨 뒤 리턴한다.
만약 맨 처음 값이 0이라면 그냥 0을 리턴한다. -> 0000.. 방지
스트림을 사용하면 코드를 더 줄일 수도 있다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
public String solution(int[] numbers) {
List<String> result = Arrays.stream(numbers).mapToObj(String::valueOf)
.sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2)).collect(Collectors.toList());
return result.get(0).equals("0")?"0": String.join("", result);
}
}
핵심은 정렬 재정의 이다.
배운 점
문제가 간단해서 쉽게 이해할 수 있었다.
그래서인지 아이디어 자체는 빠르게 생각하였지만, 정확히 어떻게 정렬시킬지에 대해서는 시간이 걸렸다.
큰 수 만들기 같은 알고리즘을 자주 본 것 같은데, 이러한 정렬 조건을 잘 사용하면 좋은 풀이를 쉽게 생각할 수 있을 것 같다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 이중우선순위큐 (0) | 2023.01.29 |
---|---|
[프로그래머스] 소수 찾기(java) (0) | 2023.01.29 |
[백준] 2589번 보물섬(java) (2) | 2023.01.28 |
[백준] 12865번 평범한 배낭(java) (3) | 2023.01.27 |
[백준] 9252번 LCS 2(java) (0) | 2023.01.26 |