programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
오늘 푼 문제는 '가장 큰 수'라는 문제였다.
풀이
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
class StrComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int sum1 = Integer.parseInt(o1 + o2);
int sum2 = Integer.parseInt(o2 + o1);
if(sum1 > sum2) return -1;
else if(sum1 == sum2) return 0;
else return 1;
}
}
public String solution(int[] numbers) {
StringBuilder answer = new StringBuilder();
List<String> list = Arrays.stream(numbers).mapToObj(i -> i + "")
.sorted(new StrComparator()).collect(Collectors.toList());
list.forEach(n -> answer.append(n));
return answer.charAt(0) == '0'?"0":answer.toString();
}
}
입력받은 숫자배열을 내가 직접 만든 StrComparator 클래스를 이용해 정렬하여 List<String> Type으로 바꿔준다.
그 후 배열을 반복하며 StringBuilder 객체인 answer에 한 글자씩 추가하면 된다.
0일 경우에는 "0" 한 글자만 반환해야 하므로 첫 번째 글자가 0일 경우에는 "0"을 반환해주도록 코드를 작성했다.
이 코드에서 가장 중요한 부분은 어떤 방식으로 정렬을 했느냐라고 생각한다.
compare 함수를 보면, o1과 o2를 문자열 상태로 합쳐준 후 int로 바꿔준다.
그리고 sum1이 sum2보다 [클 경우 o1이 작다는 뜻으로 -1을, 같을 경우에는 0을, 작을 경우에는 1을 반환해준다.]
여기서 sum1이 더 큰 숫자인데, 왜 o1이 더 작다는 뜻의 -1을 반환해야하는지 의문을 가질 수 있다.
sum1이 더 크다는 뜻은 최종문자열을 만들 때 o1 문자열이 먼저 와야 된다는 것이다.
즉, o2에 비해 배열의 앞쪽 인덱스에 위치해야 하는 것이다. 따라서 o1이 더 작다는 뜻의 -1을 반환해서 앞쪽 인덱스로 당겨오는 것이다.
압축
오늘도 설명이 부족한 거 같지만, ㅠㅠㅠ 이해해주길 바란다!!!
Comparator나 Stream 관련해서는 직접 찾아보도록 하자!!!! 참고로 코드는 이런 식으로 하면 같은 코드를 훨씬 압축시켜서 짤 수 있다.
(물론 코드를 압축시키는 것만이 능사는 아니지만, 위나 아래나 성능은 별 차이 없다는 것은 확실하다.)
import java.util.Arrays;
import java.util.stream.Collectors;
public class Solution {
public String solution(int[] numbers) {
StringBuilder answer = new StringBuilder();
Arrays.stream(numbers).mapToObj(i -> i + "")
.sorted((o1, o2) -> {
int sum1 = Integer.parseInt(o1 + o2);
int sum2 = Integer.parseInt(o2 + o1);
return sum1 > sum2?-1:sum1==sum2?0:1;
}).collect(Collectors.toList())
.forEach(n -> answer.append(n));
return answer.charAt(0) == '0'?"0":answer.toString();
}
}