코딩 테스트/프로그래머스

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

snow_hong 2022. 3. 19. 11:48

가장 큰 수

<문제 설명>

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


[ 풀이 ]

import java.util.Arrays;
import java.util.Comparator;
 
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        //int 배열을 String 배열로 변환
        String[] arr = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            arr[i] = (String.valueOf(numbers[i]));
        }
        
        //배열 정렬, 정렬 규칙으로는 2개를 더하여 더 큰 쪽이 우선순위가 있도록 정렬(내림)
        /*Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s2+s1).compareTo(s1+s2); //내림차순
                //내림차순 : (s2+s1).compareTo(o1+02);
                //오름차순 : (s1+s2).compareTo(s1+s2);
            }
        });*/
        //람다식으로 한줄로 표현가능
         Arrays.sort(arr, (s1, s2) -> (s2 + s1).compareTo(s1 + s2));
        
        //0000 처럼 0으로만 구성되어있으면 0 return
        if (arr[0].equals("0")) return "0";
        
        //그 외의 경우 순차적으로 연결하여 answer return
        for (int i = 0; i < arr.length; i++) {
            answer+=arr[i];
        }
        return answer;
    }
}

compareTo() 매서드 - 문자열 간 크기(순서)비교

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

- 내림차순 : (s2+s1).compareTo(o1+02);

- 오름차순 : (s1+s2).compareTo(s1+s2);

- ex) a.compareTo(b)

람다식

- 딱 하나의 추상 메소드만 가진 인터페이스를 구현할 때 사용하는 문법

[람다식 한줄 문법]

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

ex) Arrays.sort(arr, (s1, s2) -> (s2 + s1).compareTo(s1 + s2));

[람다식 여러줄 문법]

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

String형으로 변환

[ toString() ]

- object가 null값일 경우 Null PointerException(NPE)을 발생시킨다.

- object에 담긴 값이 String이 아니여도 출력가능

ex) int a = 12;

a.toString(); // "12"

[ String.valueOf() ]

- "null"이라는 문자열로 처리 (파라미터가 null이면 "null"로 반환)

- 항상 String 형태로 출력한다.

- NPE를 방지하기 위해서는 String.valueOf()사용을 추천한다.

ex) int a= 12;

String.valueOf(a); //"12"

728x90