알고리즘

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

데메즈 2022. 1. 17. 12:11
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42746?language=java 

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        String[] str = new String[numbers.length];
        
        for(int i=0; i<numbers.length; i++){ // 숫자배열을 String배열로 변환
            str[i] = String.valueOf(numbers[i]);
        }
        
        Arrays.sort(str, new Comparator<String>(){ 
            @Override
            public int compare(String a, String b){
                return (b+a).compareTo(a+b); // 내림차순 정렬
            }
        });
        
        if(str[0].equals("0")) return "0";
        
        for(String s:str) answer += s;
        
        return answer;
    }
}

처음에는 그냥 Arrays.sort(str)로만 했는데 값이 깨져서 들어갔다.

 

키포인트는

Arrays.sort(str, new Comparator<String>(){
            @Override
            public int compare(String a, String b){
                return (b+a).compareTo(a+b);
            }
        });

a.compareTo(b)

- 앞에서부터 비교하다 다른 문자열이 나오면 'a-b' 순서로 해당 문자의 아스키코드 값을 뺀 결과(int)를 리턴 

정렬 시 비교할 문자가 o1와 o2라면 o1+o2와 o2+o1를 비교한 뒤에 더 큰 수를 반환해줘야 한다.

내림차순 : (o2+o1).compareTo(o1+o2);

오름차순 : (o1+o2).compareTo(o1+o2);


람다식 풀이

람다식은 Comparator와 같이 딱 하나의 추상 메소드만 가진 인터페이스를 구현할 때 사용할 수 있는 문법이다.

 

* 람다식 한줄 문법

   - (매개변수) -> 명령문;  (리턴값이 있다면 자동으로 수행 결과가 리턴됨)

 

* 람다식 여러줄 문법

  - (매개변수) -> { 명령문;  명령문;  명령문; return; }

 

위에서 Comparator 로직은 한줄이므로 아래와 같이 작성할 수 있다.

Comparator<String> comp = (a, b) -> (b + a).compareTo(a + b);
Arrays.sort(result, comp);

//혹은
Arrays.sort(result, (a,b) -> (b+a).compareTo(a+b));

 

 

 

출처 :

https://ivory-room.tistory.com/43

https://codevang.tistory.com/294

 

728x90
반응형