문제
접근법
Comparator를 어떻게 잘 사용해야 값들을 서로 잘 비교하면서 정렬해줄수 있을까 고민하였다.
이 문제는 주어진 배열의 숫자를 문자열로 형변환후 서로 값들을 붙여서 비교후
내림차순 정렬하여 그 값들을 모두 붙여 문자열을 반환하는 문제이다.
방법
1. 서로의 값을 붙여 비교하기 위해 반드시 int array -> String Array 형변환
2. Comparator 를 이용해 정렬방식 재정의
+ 마지막 반환시, 0,0,0,0... 과 같이 0 값들로만 들어 왔을 때, 0으로 반환 (TestCase 11 해당)
풀이
1.
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
public String solution(int[] numbers){
StringBuffer sb = new StringBuffer(); // 결과를 문자열로 붙이는 경우 String보다 Sb가 성능이 더 좋습니다.
String[] str = new String[numbers.length]; // 비교를 위해 Input 배열을 String으로 변환
for(int i=0;i<numbers.length; i++)
str[i] = Integer.toString(numbers[i]);
// 핵심부분 - Comparator인터페이스를 이용해 정렬 재정의
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return -(o1+o2).compareTo(o2+o1); // compareTo 문자열의 아스키코드를 비교해가면서 큰수면 양수, 작은수면 음수반환
// 내림차순을 위해서 -로 값 반전 (비교시 o2+o1 먼저 비교하는 형식으로도 내림차순 정렬가능)
}
});
// 0으로만 이루어진 값의 경우 0000으로 반환하지않고, 0으로 반환하도록 한다. (이런부분은 코테에서 핵심이 아니므로 무시해도될듯)
if(str[0].equals("0"))
return "0";
else {
for(String s : str) {
//System.out.println(s);
sb.append(s);
}
}
return sb.toString();
}
}
// Integer tmp[] = Arrays.stream(numbers).boxed().toArray(Integer[]::new); // int -> integer 변환
21.07.24 풀이이며 상대적으로 코드가 길고
코드가 기본적인 분법을 토대로 작성되어있다.
2. Lambda 이용
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public static String solution(int[] numbers) {
String tmp[] = Arrays.toString(numbers).replaceAll("[^0-9 ]", "").split(" ");
Arrays.sort(tmp, (o1, o2) -> (o2.concat(o1)).compareTo(o1.concat(o2)));
String res = Arrays.toString(tmp).replaceAll("[^0-9]","");
if(res.startsWith("0")) return "0";
return res;
}
}
22.02.27 오늘 다시 푼 코드이다.
Arrays.toString 메서드 하나로 많은 코드를 줄였다.
'Algorithm > 프로그래머스 고득점 Kit' 카테고리의 다른 글
[완전탐색] 모의고사 - Java 풀이 (0) | 2021.07.27 |
---|---|
[정렬] H-Index - Java 풀이 (0) | 2021.07.24 |
[정렬] K번째 수 - Java 풀이 (0) | 2021.07.24 |
[Hash] 베스트 앨범 - Java 풀이★★★ (0) | 2021.06.17 |
[Hash] 위장 - Java 풀이 (0) | 2021.06.16 |