자바칩

[프로그래머스 / Java] 코딩테스트 연습: 가장 큰 수 (정렬) 본문

알고리즘/프로그래머스

[프로그래머스 / Java] 코딩테스트 연습: 가장 큰 수 (정렬)

아기제이 2024. 8. 11. 21:06
728x90

난이도: Level 2

문제: https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

이 문제는 숫자 배열을 모두 문자열 배열로 바꿔주고

Arrays.sort(문자열 배열 이름, Comparator 익명 클래스로 정렬 기준 세팅);

이것만 잘 해주면 된다.

 

int[] numbers = {3, 30, 34, 5, 9}

이 배열에서 얻을 수 있는 가장 큰 수는 9534330이다.

즉, 9, 5, 34, 3, 30으로 정렬을 해줘야 한다는 말이다.

 

9, 5는 정렬하는 기준을 쉽게 알겠는데 34, 3, 30는 어떻게 정렬을 해야할 지 감이 잘 안 올 것이다.

 

일단 문자열 배열을 선언해서 numbers 배열에 있는 정수들을 모두 문자열로 바꿔준다.

String[] strings = {"3", "30", "34", "5", "9"}

 

정렬을 하는 기준은 두 문자열을 이어붙인 값을 정수로 변환하고, 내림차순 정렬해주면 된다.

 

만약 두 문자열이 "34"와 "3"이라면

"34" + "3" = "343"

"3" + "34" = "334"

두 수중에 더 큰 값은 343이다.

 

만약 두 문자열이 "3"과 "30"이라면

"3" + "30" = "330"

"30" + "3" = "303"

두 수중에 더 큰 값은 330이다.

 

이것을 내림차순 정렬하는 방법은 다음과 같다.

 
    // 두 문자열의 합을 정수로 바꾼 값 중에
    // 더 큰 값을 기준으로 내림차순 정렬
    Arrays.sort(strings, new Comparator<>() {
        public int compare(String s1, String s2) {
            int a = Integer.parseInt(s1 + s2);
            int b = Integer.parseInt(s2 + s1);
            return b - a;
        }
    });
 

 

b - a를 리턴하면 자동으로 내림차순 정렬이 되고, a - b를 리턴하면 자동으로 오름차순 정렬이 된다.

b - a 대신 Integer.compare(b, a)로 작성해도 같은 결과를 리턴한다.

 

정렬된 문자열 배열을 최종 리턴할 문자열 변수인 answer에 모두 이어붙여서 리턴하면 되는데, 그 전에 주의할 것이 있다.

만약 주어진 배열이 {0, 0, 0}일 때는 정렬된 배열의 결과도 {0, 0, 0}이 나오게 된다.

이 배열을 answer에 이어붙이면 "000"을 리턴해서 틀린 값이 된다.

정렬된 배열의 첫 번째 원소가 0이라면 곧바로 "0"을 리턴시키자.

 

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*;
 
class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        // 정수를 문자열로 변환한 배열
        String[] strings = new String[numbers.length];
        
        // 정수를 문자열로 변환해서 저장
        for (int i = 0; i < numbers.length; i++) {
            strings[i] = String.valueOf(numbers[i]);
        }
        
        // 두 문자열의 합을 정수로 바꾼 값 중에
        // 더 큰 값을 기준으로 내림차순 정렬
        Arrays.sort(strings, new Comparator<>() {
            public int compare(String s1, String s2) {
                int a = Integer.parseInt(s1 + s2);
                int b = Integer.parseInt(s2 + s1);
                return b - a;
            }
        });
        
        // 정렬한 문자열 배열의 첫 원소가 0이라면 곧바로 0 리턴
        if (strings[0].equals("0")) {
            return "0";
        }
        
        // 정렬한 문자열 배열의 원소들을 차례대로 이어붙이기
        for (String string : strings) {
            answer.append(string);
        }
        
        // 이어붙인 문자열 리턴
        return answer.toString();
    }
}
cs