💡Problem Solving/Programmers
[프로그래머스] 가장 큰 수 (Java)
gom20
2021. 12. 8. 20:31
문제
https://programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
풀이
[6, 10, 2] | "6210" |
숫자를 String으로 변환 한 후, 인접 한 숫자끼리 합쳐서 사전 순서를 비교한다.
순서대로 합친 문자열이 사전의 뒷 순서가 되도록 숫자의 위치를 변경해준다.
[6, 10, 2]
6, 10 = 610
10, 6 = 106
610이 사전의 뒷 순서이므로 변경하지 않는다.
[6, 10, 2]
10, 2 = 102
2, 10 = 210
210이 사전의 뒷 순서이므로 순서를 변경한다.
[6, 2, 10]
6, 2 = 62
6, 2 = 26
순서를 변경하지 않는다.
답: 6210
Java의 Comparator로 정렬 조건을 구현한다.
String s1, String s2 문자가 있을 때
a = s1 + s2
b = s2 + s1
a.compareTo(b) == 0 : a 와 b 값이 동일.
a.compareTo(b) > 0 : a의 사전 순서가 b보다 뒤이다.
a.compareTo(b) < 0 : a의 사전 순서가 b보다 앞이다.
@Override
public int compare(String s1, String s2){
String a = s1 + s2;
String b = s2 + s1;
int rs = a.compareTo(b);
if(rs == 0){
return 0;
} else if(rs > 0) {
return -1;
} else {
return 1;
}
}
소스코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
List<String> list = new ArrayList<String>();
boolean allZero = true;
for(int number : numbers){
if(allZero && number != 0) allZero = false;
list.add(String.valueOf(number));
}
if(allZero) return "0";
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
String a = s1 + s2;
String b = s2 + s1;
int rs = a.compareTo(b);
if(rs == 0){
return 0;
} else if(rs > 0) {
return -1;
} else {
return 1;
}
}
});
for(String n : list){
answer += n;
}
return answer;
}
}