알고리즘/문제풀기

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

hyun_jo_o 2019. 5. 1. 23:31

처음 문제를 풀 때 아래의 코드 처럼 새로운 배열을 만들어서 정렬한 후 마지막 배열을 뽑아 오려고 했다. 

 

public static String solution(int[] numbers) {
	        String answer = "";				//정답을 저장할 문자열
	        int nlength = numbers.length;
	        int arrlength = 1;				//새로운 배열을 저장할 배열크기
	        String[] str = new String[nlength];
	        for(int i=0; i<nlength; i++) {
	        	str[i] = String.valueOf(numbers[i]);	//하나씩 배열에서 가져와서 String배열으로 저장
	        	arrlength *= i+1;
	        }
	        String[] temp = new String[arrlength];
	        for(int i=0; i<arrlength; i++) {			//새로운 String배열에 숫자를 합친거 넣기
	        	for(int j=0; j<nlength; j++) {
	        		temp[i] += str[j];
	        	}
	        	temp[i].replace("null","");
	        }
	        Arrays.sort(temp);						//배열 정렬
	        answer = temp[arrlength];
	        return answer;							//마지막 배열 가져오기
	    }

 

	 public static String solution(int[] numbers) {
	        int nlength = numbers.length;
	        String[] str = new String[nlength];		
	        for(int i=0; i<nlength; i++) {
	        	str[i] = String.valueOf(numbers[i]);	//int배열을 string 배열로 바꾸기
	        }
	        	Arrays.sort(str,  (o1, o2) -> (o2 + o1).compareTo(o1 + o2));	//배열을 정렬시킴
	        	if(str[0].equals("0")) return "0";	// 0이면 0리턴
	        	
	        	StringBuilder sb = new StringBuilder();		//
	        	for(int i=0; i<str.length; i++) {
	        		sb.append(str[i]);					//정렬된 문자열을 뒤에 추가 시킨다
	        	}
	        	return sb.toString();
	        }

배열을 정렬 할 때 [3, 31, 34] 인 경우 문자열로 정렬했을 때, 34 31 3 으로 정렬이 된다. 그래서 자바 람다식을 이용해서  3 과 31을 정렬하기 위해, 331 과 313을 비교해서 문자열로서 더 큰 문자열을 만드는 순으로 정렬했다. 

 

람다식이란?

 - 식별자 없이 실행 가능한 함수

 

람다식 사용법

(매개변수, ... )  -> { 실행문 }

매개변수는 자유롭게 지정 가능함.

 

코드에서 람다식 사용

(o1, o2) -> (o2 + o1).compareTo(o1 + o2)

 

매개변수를 o1, o2로 지정

(o2 + o1).compareTo(o1 + o2) 이 부분이 실행문

 

 

 

참고 : https://coding-factory.tistory.com/entry/Java-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda-Expressions-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%98%88%EC%A0%9C