https://programmers.co.kr/learn/courses/30/lessons/42746?language=java
풀이
앞 뒤 문자를 직접 붙여보고 비교해서 푼다. 예를들어 30과 34면 3034와 3430을 비교해서 3430이 더 크므로 34, 30 순으로 내림차순 정렬을 해준다. 처음에는 삽입정렬 하듯이 for문을 2번돌려서 compareTo() 함수를 이용해 문자열을 비교했는데 런타임 에러가 났었다..
Arrays.sort() : String 배열 number를 정렬
Comparator 인터페이스 : 두 매개변수 객체를 비교하는 역할
- compare() 메소드 : compator 인터페이스 내 선언된 메소드로 반드시 오버라이딩(구현). 객체를 비교할 기준을 정의
- a.compareTo(b) : 'a-b' 순서로 해당 문자의 아스키 코드 값을 뺀 결과(int)를 리턴. 어떤 문자가 사전적인 순서로 앞에 있는지 리턴해주기 때문에 정렬에 사용한다.
- (b+a).compareTo(a+b) 의 결과가 양수면 b+a가 더 큰 수이기 때문에 b,a 순으로 정렬한다.
※ 주의할 점 : 테스트케이스가 {0,0,0,0}일 경우 "0" 한 문자열을 리턴
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
// 문자열 배열로 변환
String[] number = new String[numbers.length];
for(int i=0;i<numbers.length;i++){
number[i] = String.valueOf(numbers[i]);
}
// 내림차순 정렬
Arrays.sort(number, new Comparator<String>(){
public int compare(String a, String b){
return (b+a).compareTo(a+b);
}
});
// 배열에 0 만 있는 경우(정렬배열 맨처음이 0) "0" 리턴
if(number[0].equals("0")) return "0";
// 문자열 합치기
for(String n : number)
answer+=n;
return answer;
}
}
+
람다식 : comparator와 같이 하나의 추상메소드만 가진 인터페이스를 구현할 때 사용할 수 있는 문법이다.
(매개변수) -> 명령문;
(매개변수) -> {명령문;명령문;명령문;return;}
위의 Arrays 정렬 코드를 람다식으로 바꿔보면 아래와 같다.
// 정렬
Arrays.sort(number, new Comparator<String>(){
public int compare(String a, String b){
return (b+a).compareTo(a+b);
}
});
// Compatator 로직을 람다식으로
Comparator<String> comp = (o1, o2) -> (o2 + o1).compareTo(o1 + o2);
Arrays.sort(number, comp);
// 함수형 인터페이스가 있는 자리를 람다식으로 대신하기
Arrays.sort(number, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
'Algorithm & Data Structure > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 Lv.2 > 124 나라의 숫자 (0) | 2022.03.04 |
---|---|
[Java] 프로그래머스 Lv.2 > 멀쩡한 사각형 (0) | 2022.02.28 |
[Java] 프로그래머스 Lv.2 > 큰 수 만들기 (0) | 2022.02.28 |
[Java] 프로그래머스 Lv.2 > 기능개발 (0) | 2022.02.28 |
[Java] 프로그래머스 Lv.2 > 다리를 지나는 트럭 (0) | 2022.02.28 |