가장 큰 수
⭐️ 코드
- 프로그래머스에서 빌드할 때는 출력문은 다 지우고 하셔야 합니다.
package Programmers.Level_2;
import java.util.*;
public class PL2_17 {
// Level2 가장 큰 수
public String solution(int[] numbers) {
// numbers 배열을 String 변환
String[] sArr = new String[numbers.length];
for (int i = 0; i < sArr.length; i++) {
sArr[i] = Integer.toString(numbers[i]);
}
System.out.println(Arrays.toString(sArr));
// String으로 변환된 sArr[] 원소들을 사전순으로 내림차순 정렬
// Arrays.sort 재정의
Arrays.sort(sArr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2); // 내림차순 [9, 5, 34, 3, 30]
// return (o1+o2).compareTo(o1+o2); // 오름차순 [3, 30, 34, 5, 9]
// return (o1+o2).compareTo(o2+o1); // [30, 3, 34, 5, 9]
// return (o2+o1).compareTo(o2+o1); // [3, 30, 34, 5, 9]
// return (o2).compareTo(o1); // 내림차순 [9, 5, 34, 30, 3]
// return (o1).compareTo(o2); // 오름차순 [9, 5, 34, 30, 3]
}
});
System.out.println(Arrays.toString(sArr));
// 문자열 합치기
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sArr.length; i++) {
sb.append(sArr[i]);
}
String answer = sb.toString();
// 0으로 시작하면 모두가 0일테니까 0으로 반환
if (answer.startsWith("0")) {
return answer = "0";
}
return answer;
}
public static void main(String[] args) {
PL2_17 p2 = new PL2_17();
int[] numbers = {3, 30, 34, 5, 9};
System.out.println(p2.solution(numbers)); //9 5 34 3 30
}
}
💡 문제 풀이
오랜만에 정말 어려운 문제를 풀게 됐다.
솔직히 하루 정도 생각하다 포기했었는데 다시 도전해 봤다. 물론 정답을 보지 않고는 풀기가 힘들었다.
Arrays.sort()의 Comparator를 사용해야 하는 문제였고, 그것을 재정의 해야 했었다.
Arrays.sort(arr, Collections.reverseOrder())를 사용하려 했던 사람들이 있을 것이다.
Collections 메서드는 Wrapper 클래스에만 사용 가능하다.
ex) Integer, Character, String...
char, double, long, int 같은 PrimitiveType의 배열에는 적용이 불가능하니 꼭 명심해 두자.
문제를 설명하기 앞서 가장 중요하게 볼 부분은 아래다.
Arrays.sort -> Comparator
Arrays.sort(sArr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2); // 내림차순 [9, 5, 34, 3, 30]
// return (o1+o2).compareTo(o1+o2); // 오름차순 [3, 30, 34, 5, 9]
// return (o1+o2).compareTo(o2+o1); // [30, 3, 34, 5, 9]
// return (o2+o1).compareTo(o2+o1); // [3, 30, 34, 5, 9]
// return (o2).compareTo(o1); // 내림차순 [9, 5, 34, 30, 3]
// return (o1).compareTo(o2); // 오름차순 [9, 5, 34, 30, 3]
}
});
Arrays.sort() 메서드를 원하는 정렬 방식으로 바꾸고 싶다면 , Comparator 익명인터페이스를 명시해 줘야 하고, java.util.Comparator를 구현한 Class내 compare() 메서드를 원하는 정렬조건으로 @Override 해야 한다.
만약 입력되는 값이 3과 30이라면 o1 = 3, o2 = 30이 된다.
둘 다 문자열 이기 때문에 o2+o1 = 303, o1+o2 = 330이 되고, 두 개를 비교했을 때 더 큰 값이 o1+o2 = 330이기 때문에 3이 더 앞에 와야 한다고 판단하여 정렬된다.
그다음에는 또 다른 문자로 변형된 숫자와 그전 수가 붙어 비교가 이루어지고, 결과를 반환한다.
우리가 정렬 방식을 두 문자를 붙이는 방식으로 하였기 때문에 이렇게 변경되는 것이라는 걸 명심하자.
솔직히 아직 뭔지는 정확히 이해할 수 없었다. 아래 두 블로그를 참고하여 공부를 좀 더 해 보았다.
// 문자열 합치기
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sArr.length; i++) {
sb.append(sArr[i]);
}
String answer = sb.toString();
// 0으로 시작하면 모두가 0일테니까 0으로 반환
if (answer.startsWith("0")) {
return answer = "0";
}
마지막으로 문자열 관련 연산은 StringBuilder로 하는 것이 빠르기 때문에 StringBuilder를 사용하고, 조건문은 문자열이 0으로 시작하면 모두 0으로 되어있을 것이기 때문에 문자열 "0"으로 바꿔서 다시 리턴해준다.
👀 후기
진짜 너무 어려웠고 정렬에 대해 조금 알았다고 생각하기 때문에 다른 문제도 도전해 보도록 하겠다!!
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스/Programmers] 구명보트 (Java - Greedy - Lv2) (0) | 2023.02.04 |
---|---|
[프로그래머스/Programmers] 카펫 (Java - 완전탐색 - Lv2) (0) | 2023.02.03 |
[프로그래머스/Programmers] 영어 끝말잇기 (Java - HashSet - Lv2) (0) | 2023.01.31 |
[프로그래머스/Programmers] 짝지어 제거하기 (Java - Stack - Lv2) (0) | 2023.01.30 |
[프로그래머스/Programmers] 피보나치 수 (Java - Lv2) (0) | 2023.01.27 |