본문 바로가기

알고리즘

[프로그래머스/Java] 가장 큰 수 - comparator

처음에는 생각을 잘못해서 틀렸다.. 두번 틀렸다

숫자를 받아서 String으로 변환해서 맨 앞자리부터 비교하는식으로 했는데 너무 복잡하게 생각한 것 같다.

import java.io.*;
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        Integer[] arr = new Integer[numbers.length];
        for(int i=0 ; i<numbers.length; i++){
            arr[i] = new Integer(numbers[i]);
        }
        Arrays.sort(arr, new Comparator<Integer>(){
            @Override
            public int compare(Integer a, Integer b){
                String tempa = a.toString();
                String tempb = b.toString();
                int max = tempa.length() > tempb.length()? tempa.length():tempb.length();
                int min = tempa.length() > tempb.length()? tempb.length():tempa.length();
                // System.out.println(tempa + " " + tempb + " " + compare_range);
                for(int i=0; i<min; i++){
                    if(Integer.parseInt(tempa.substring(i,i+1))!=Integer.parseInt(tempb.substring(i,i+1))){
                        return -(Integer.parseInt(tempa.substring(i,i+1))-Integer.parseInt(tempb.substring(i,i+1)));
                    }
                }
                return -(tempa.length()-tempb.length());
                // return 1;
            }
        });
        System.out.println(Arrays.toString(arr));
        for(int a : arr)
            answer+=Integer.toString(a);
        
        return answer;
    }
}

반례) 

[3, 30, 34, 5, 9] 9534330

이렇게 나와야되는데 위 코드 돌리면

3이랑 30중 길이가 긴게 앞으로 오므로

9534303 이렇게 나옴 ㅠㅠ

 

구글링 해봤더니 숫자를 문자로 바꾸는것까지는 똑같은데 나처럼 그 string을 쪼개서 비교한게 아니고 스트링 두개를 붙여서 a+b 한거랑 b+a 한것중에 큰 값이 되도록 배열 순서를 바꿔주면 된단다.. ^_^.... 

import java.io.*;
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        Integer[] arr = new Integer[numbers.length];
        for(int i=0 ; i<numbers.length; i++){
            arr[i] = new Integer(numbers[i]);
        }
        Arrays.sort(arr, new Comparator<Integer>(){
            @Override
            public int compare(Integer a, Integer b){
                String tempa = a.toString();
                String tempb = b.toString();
                String t1 = tempa+tempb;
                String t2 = tempb+tempa;
                return -(Integer.parseInt(t1)-Integer.parseInt(t2));
            }
        });
        System.out.println(Arrays.toString(arr));
        for(int a : arr)
            answer+=Integer.toString(a);
        
        return answer;
    }
}

다 맞을 줄 알았는데 또 하나 틀림

아까 블로그에서 무슨 예외처리 하나 해주는거 봤는데 그거같다.. 뭘 예외처리해야되는지 한번 보고와야겠다.

 

import java.io.*;
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        Integer[] arr = new Integer[numbers.length];
        for(int i=0 ; i<numbers.length; i++){
            arr[i] = new Integer(numbers[i]);
        }
        Arrays.sort(arr, new Comparator<Integer>(){
            @Override
            public int compare(Integer a, Integer b){
                String tempa = a.toString();
                String tempb = b.toString();
                String t1 = tempa+tempb;
                String t2 = tempb+tempa;
                return -(Integer.parseInt(t1)-Integer.parseInt(t2));
            }
        });
        
        if(arr[0]==0)
            return "0";
        
        for(int a : arr)
            answer+=Integer.toString(a);
        return answer;
    }
}

최종 코드! 예외처리는 아래서 7번째줄에 if(arr[0]==0=)일 때!

정렬을 했기때문에 03453 이런값은 안나올테니 맨앞에 0이 있다는 것은 0이거나 00...00 이런식으로 되어있다는 의미인데 0이 아무리 많아도 숫자니까 '0'으로 리턴해야되므로 예외처리 해줘야 함.