문제

풀이코드
public String solution(int[] numbers) { //가장 큰 수
String answer = "";
String[] arr = new String[numbers.length]; //int배열을 넣을 String배열 새로 생성
for(int i = 0; i < numbers.length; i++){ //int배열을 String배열로 변경시켜서 대입
arr[i] = String.valueOf(numbers[i]);
}
Arrays.sort(arr,new Comparator<String>(){ //String 배열을 특별한 방식으로 내림차순으로 변경
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2);
}
});
for(String x : arr){ //내림차순으로 정렬한 String배열을 answer에다가 넣음
answer += x;
}
if(arr[0].equals("0")){ //모든 배열이 0인 경우도 있으므로 그땐 0을 return
return "0";
}
return answer;
}
우선, 처음에는 조합들을 찾아서 예를 들어, 6과 10의 비교면 6과 1을 비교하고 6이 더 크니까 610이렇게 만들고
33과 34의 비교면 3과 3을 비교한 뒤, 같으면 그 뒷자리인 3과 4를 비교해서 더 큰 3433이렇게 만들고 이런식으로해서 풀었는데...내심 풀면서 이거 배열이 많아지면 터질 것 같은데...라고 생각했는데 역시나 터져버렸다....
그래서 다른 분들의 풀이를 살짝 보았는데 다들 Comparator을 사용해서 푸시길래 지금까지는 Comparator의 개념만
대충알았지 적재적소에 어떻게 사용하는지는 잘 몰라서 이번 기회에 Comparator에 대해서 좀 더 자세히 알아보았다.
보니까 compare메서드를 오버라이드해서 사용을 할 때 나는 단순히 a.compareTo(b)이렇게 return하면 오름차순이고
내림차순으로 return하려면 b.compareTo(a)이렇게 써야된다고 외웠는데, 이게 그런 개념이 아니였다.
일단 return값이 음수면 순서가 그대로고 양수면 순서가 바뀐다!!! 이것만 알면 되는데
a=10, b=6이라고 가정을 했을 때, 10.compareTo(6)를 하면 10-6값을 구한다. 그러면 양수(4)이므로 순서가 바뀐다.
즉, 원래는 {10,6}였던 것이 {6,10}으로 바뀌는 것이다. 이렇게 되서 오름차순으로 바뀌는 것이고
만약, 6.compareTo(10)을하면 6-10값을 구하는데 음수(-4)가 되므로 순서가 바뀌지 않는다.
즉, 원래모양 그대로인 {10,6}이 유지가 되어서 내림차순이 되는 것이다.
이것을 토대로 위 문제에서 적용을 하자면 예시코드에 나와있는 {6,10,2}를 예를 들어서 사용하자면
우리는 문제에서 저 3개의 수를 조합해서 제일 큰 값을 만들어야 하는데 단순히 a.compareTo(b)꼴로 비교를 하면
제일 큰 값을 내림차순으로 비교를 한다고 해도 1062가 나온다. 그러면 우리가 구해야 하는 6210과는 완전히 다른데
그래서 저 3개의 수 중에 일단은 2개의 수를 이어붙인다. 610, 106이런식으로 그리고 비교를 해서 더 큰 수를 앞으로 배열한다.
그러면 {6,10,2} -> {6,10,2}가 되고 그다음 또 두 수를 비교한다. 102, 210이렇게 그러면 둘 중에 또 큰 수를 앞으로 배열한다.
그러면 {6,10,2} -> {6,2,10}가 되고 이것을 다 이어붙이면 우리가 원하는 6210이 나온다!!!
그리고 (b+a).compareTo(a+b)꼴은 위에서 설명한대로 생각하면 만약에 b+a가 더 크면 a,b의 순서가 바뀐다.
그러므로 a = 10, b = 2라고 가정하고 예시를 들면 210.compareTo(102)를 했을 때, 210이 더 크므로 10과 2의 순서가 바뀌어서 {6,10,2} -> {6,2,10}꼴이 되는 것이다!!!
Comparator가 정말 처음 봤을 땐 이해하기가 좀 어려웠는데 문제를 풀면서 다시 한번 접하니까 이해가 쉽게 되어서 좋았다!!!
'프로그래머스 > Level 2' 카테고리의 다른 글
| [프로그래머스][Level2][Java] 스킬트리 (0) | 2022.04.01 |
|---|---|
| [프로그래머스][Level2][Java] 방문 길이 (0) | 2022.04.01 |
| [프로그래머스][Level2][Java] 타겟 넘버 (0) | 2022.03.25 |
| [프로그래머스][Level2][Java] 더 맵게 (0) | 2022.03.23 |
| [프로그래머스][Level2][Java] 주식가격 (0) | 2022.03.21 |