반응형
- 첫 풀이
이 문제는 바로 직전에 풀었던 소수 찾기 문제와 같은 방식으로 풀어보고자 했고, 테스트 케이스 역시 통과할 수 있었다.
그러나 제출 후 채점을 한 결과는 처참했다.
이후 문자열을 연결 처리하는 과정에서 매 번 새로운 객체를 생성해내는 String을 대신해 하나의 객체에 지속적인 갱신이 가능한 StringBuilder를 사용해 풀어보고자 했지만 잘 풀리지 않았다.
- 정답풀이
결국 다른 분들의 풀이를 참고했더니 특정 기준으로 배열을 정렬하는 Comparator을 이용하는 것을 보고 이와 관련해서 생각하니 쉽게 풀 수 있었다. 예제 입력 1의 경우 6, 10, 2가 있을 때 두 개씩 생각해보면 6+10인 610과 10+6인 106을 비교하면 610이 더 크므로 자리를 바꿀 필요가 없다. 이러한 방식으로 정렬을 수행한 뒤, 모두 합쳐주면 정답이 된다.
단, 여기서 주의해야 할 점은 모두 0으로 입력이 되는 경우 위와 같은 로직으로는 0000.... 과 같이 0이 지속될 수 있으므로 가장 첫 숫자가 0이라면, 그 뒤의 숫자도 0일 수밖에 없기 때문에 0을 반환하는 예외처리를 추가해주어야 한다.
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String solution(int[] numbers) {
String answer = "";
// 1. 입력 데이터를 문자열 배열로 변환.
String[] str = new String[numbers.length];
for(int i = 0 ; i<str.length;i++){
str[i] = String.valueOf(numbers[i]);
}
// 2. Comparator 인터페이스로 정렬 기준을 설정.
Arrays.sort(str,new Comparator<String>(){
// 예제 입력1에서 6과 10을 생각해보면 o2가 6, o1이 10이 된다. 이를 지속해서 반복.
public int compare(String o1,String o2){
return (o2+o1).compareTo(o1+o2);
}
});
// 3. 모든 문자열을 연결한다.
for(String arr : str)
answer+=arr;
// 4. 입력 데이터가 모두 0인 경우 예외 처리.
if(str[0].equals("0")) answer = "0";
return answer;
}
}
반응형