ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 정렬 - 가장 큰 수
    알고리즘 공부/문제 풀이 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

    댓글

Designed by Tistory.