알고리즘 공부/문제 풀이
[프로그래머스] 정렬 - 가장 큰 수
valid_ming
2020. 8. 6. 23:18
처음 문제를 보고 든 생각은
큰 자리수부터 비교해서 정렬할까?
모두 같은 자리수로 만들어서 sort한뒤 예외처리할까? ...... 이었다.
이 생각들은 전부 입력을 int로만 생각했기 때문이다.
첫 번째 생각에서 숫자로의 비교가 아닌 문자로의 비교를 생각하여 사전식 배열을 생각하였으면
문제가 더 빨리 풀렸을 것 같은데.. 숫자라는 집착때문에 수의 연산을 중요시 한것 같다.
그래서 처음 내 풀이를 보면
입력 받은 값들을 같은 자리수로 만들었고,
3,30이 입력으로 들어오는 경우 303이 아닌 330이 출력되어야 하기 때문에 이를 위한 예외처리를 하여
출력하는 방식이다
class Array{
int before; // 입력받은 number
int after; // 자리수 맞춘값
}
//기본적으로 내림차순 정렬, 만약 값이 같다면 before값에 따라 오름차순 정렬
// 30보다 3이 우선!
class Valdescending implements Comparator<Array>{
public int compare(Array a, Array b) {
Integer tmp1=a.after;
Integer tmp2=b.after;
if(tmp1==tmp2) {
Integer ttmp1=a.before;
Integer ttmp2=b.before;
return ttmp1.compareTo(ttmp2);
}
return tmp2.compareTo(tmp1);
}
}
public class sort2 {
static String solution(int[] numbers) {
String answer = "";
// 들어오는 수를 한번 정렬해준다...
// 30,30,30,3,3 넣는 경우와 3,3,30,30,30 넣는 경우 다른 출력값이 나와.. 처리해준것
Arrays.sort(numbers);
ArrayList<Array> array=new ArrayList<Array>();
for(int i=0;i<numbers.length;i++) {
Array temp=new Array();
temp.before=numbers[i];
//자리수를 맞추어 after 값에 넣어준다.
if(numbers[i]<10) temp.after=numbers[i]*1000;
else if(numbers[i]<100) temp.after=numbers[i]*100;
else if(numbers[i]<1000) temp.after=numbers[i]*10;
else temp.after=numbers[i];
array.add(temp);
}
Valdescending valAscending=new Valdescending();
Collections.sort(array,valAscending);
//정답 출력
for(int i=0;i<numbers.length;i++) {
int before=array.get(i).before;
answer += String.valueOf(before);
}
//가장 큰수가 0인경우 결과는 0
if(array.get(0).before ==0) answer="0";
return answer;
}
하지만,,, 한 4문제 빼고는 실행 실패로 나왔다..
근데 왜 실패인지 잘 모르겠다 ㅠㅠ
결국 다른 사람의 코드를 찾아보게 되었다.
이 문제의 핵심은 사전식 배열이다.
int형 데이터들을 string형으로 변환하여 비교해준다.
단, 3과 30의 경우 3이 우선순위이므로 예외 처리를 해준다.
static String solution(int[] numbers) {
String answer = "";
String[] str=new String[numbers.length];
for(int i=0;i<str.length;i++) {
str[i]=String.valueOf(numbers[i]);
}
Arrays.sort(str, new Comparator<String>() {
public int compare(String s1,String s2) {
// 예외 처리 부분
return (s2+s1).compareTo(s1+s2);
}
});
if(str[0].startsWith("0")) {
answer += "0";
} else {
for(int j=0; j<str.length; j++) {
answer += str[j];
}
}
return answer;
}
자바 Array compartor와 관련한 블로그 자료
https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html