문제풀이는 나의 풀이보다 더 깔끔한 소스로.....

 

 

문제 풀이 CASE 1.

package algorithm;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution1 {
	
	public static void main(String[] args) {
		int num[] = {10,50,64,20,31,40};
		String result = solution(num);
		System.out.println(result);
	}
	
    public static String solution(int[] numbers) {
        String answer = "";

        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < numbers.length; i++) {
            list.add(numbers[i]);
        }
        
        Collections.sort(list, (a, b) -> {
        	// list에서 순서대로 2개의 요소를 추출합니다. 이를 각각 a와 b로 정의하고 String 자료형으로 만들어 as와 bs를 만듭니다.
            String as = String.valueOf(a);
            String bs = String.valueOf(b);
            /*
             * return문에 보면 as + bs 와 bs + as를 수행합니다.
             * 만약 as = 10, bs = 20인 경우, 연산의 결과는 1020과 2010으로 나옵니다.
             * 이 결과 값을 가지고 Integer.compare()를 수행합니다.
             * Integer 라이브러리의 compare 함수를 살펴보면 x==y 인 경우 0을 반환, x < y인 경우 음수, x > y인 경우 양수를 반환합니다.
             * 1020과 2010을 비교하면 x < y인 경우로, 음수를 반환합니다.
             * Integer.compare()로부터 나온 연산 결과를 Collections.sort() 내부의 comparator에서 사용하게 됩니다.
             * comparator의 경우 음수는 오름차순, 양수는 내림차순으로 요소의 자리를 바꿔줍니다.
             * 즉, Integer.compare()는 (ab + sb) < (sb + ab)인 경우에 음수를 반환하지만 sb가 ab보다 앞에 위치하도록 만들기 위해서
             * Integer.compare() 앞에 마이너스(-) 부호를 붙여 양수를 반환하게 하여 Collections.sort()가 내림차순으로 정렬하도록 하는 것입니다.
             */
            return -Integer.compare(Integer.parseInt(as + bs), Integer.parseInt(bs + as));
        });
        
        StringBuilder sb = new StringBuilder();
        for(Integer i : list) {
            sb.append(i);
        }
        
        answer = sb.toString();
        if(answer.charAt(0) == '0') {
            return "0";
        }else {
            return answer;
        }
    }
}

 

문제풀이 CASE2.

import java.util.Arrays;

class Solution1 {
	
	public static void main(String[] args) {
		int num[] = {10,50,64,20,31,40};
		String result = solution(num);
		System.out.println(result);
	}
	
	 public static String solution(int[] numbers) {
	        String answer = "";
	        answer = Arrays.stream(numbers)
	        // 기본형 특화 스트림을 Stream으로 변환해주는 메서드다.
	        .mapToObj(String::valueOf)
	        // sorted는 스트림의 아이템들을 정렬하여 새로운 스트림을 생성합니다. 
	        .sorted((s1, s2) -> -s1.concat(s2).compareTo(s2.concat(s1)))
	        // Stream의 데이터를 변환하지 않고, 더하거나 빼는 등의 연산을 수행하여 하나의 값으로 만든다면 reduce를 사용할 수 있습니다.
	        // reduce()의 param으로 (total, n) -> total + n가 전달되고, reduce는 a1, a2, a3, a4...의 stream을 a1 + a2 + a3 + a4...로 연산을 수행합니다.
	        // 첫번째로 total=a1, n=a2가 되고, 두번째로 total=(a1+a2), n=a3가 됩니다.
	        .reduce("", (s1, s2) -> s1.equals("0") && s2.equals("0") ? "0" : s1.concat(s2));
	        
	        return answer;
    }
}

 

언제쯤 이런 코딩을 할 수 있을까....

+ Recent posts