알고리즘 공부/문제 풀이

[프로그래머스] 정렬 - 가장 큰 수

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