-
[프로그래머스] 정렬 - 가장 큰 수알고리즘 공부/문제 풀이 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
'알고리즘 공부 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 스택/큐 - 주식가격 (1) 2020.08.10 [프로그래머스] 정렬 - H-index (1) 2020.08.06 [프로그래머스] 정렬 - k 번째 수 (1) 2020.08.06 [2019 카카오 겨울인턴] 호텔방 (JAVA) (0) 2020.05.08 [2019 카카오 겨울인턴] 불량사용자 (JAVA) (0) 2020.05.08