코딩 테스트/자료구조

[프로그래머스] 42746 가장 큰 수(Lv.2) - 정렬

토자맨 2024. 7. 5. 20:08

문제

numbers[]에 0 or 양의 정수가 주어졌을 때 정수를 이어 붙여서 만들 수 있는 가장 큰 수를 반환하라

코드

시도 1 - X

처음엔 단순하게 내림차순 정렬한 후 String으로 변환하여 출력하는 코드를 작성했다.
이 경우 [3, 30, 34]일 경우 34303이 되어 틀린 답이 나오게 된다.


/**
1. numbers 배열에서 크기 순서대로 정렬한다.
2. 정렬된 순서대로 이어 붙여 숫자를 만든다.
3. 반환한다.
**/

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {

        Arrays.sort(numbers);

        StringBuilder sb = new StringBuilder();
        for (int num : numbers) {
            sb.append(num);
        }
        String result = sb.toString();

        return result;
    }
}

시도 2 - O

아이디어를 떠올리지 못해서 다른 사람 코드를 참조했다...
정렬 할 때 두 요소의 값을 붙여서 비교한 후 더 큰 값의 앞 요소를 내림차순의 앞으로 보내는 방식이다.
예를 들어 A와 B가 있을 때 AB, BA를 비교한 후 AB가 더 크다면 내림차순 [A, B]로 정렬하고 BA가 더 크다면 내림차순 [B, A]로 정렬한다.

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {

        // numbers[] 요소들을 String 형식으로 변환
        String[] stnumbers = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            stnumbers[i] = String.valueOf(numbers[i]);
        }

        /** 두 값을 이어 붙여서 비교
        1. 앞(o2+o1) > 뒤(o1+o2) = 음수 -> o1, o2 순서 그대로
        2. 앞(o2+o1) < 뒤(o1+o2) = 양수 -> o1, o2 순서 바꿔서(o2, o1)
        3. 앞(o2+o1) == 뒤(o1+o2) = 0 -> o1, o2 순서 그대로
        즉, compareTo()의 반환값이 음수 or 0이면 순서 그대로(o1, o2), 양수면 순서 바꿔서(o2, o1)
        */
        Arrays.sort(stnumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

        // numbers[]의 모든 수가 0일 경우 "0" 반환
        if (stnumbers[0].equals("0")) {
           return "0";
        }

        // Strinng 배열인 stnumbers[]의 요소들을 하나의 String으로 만들기
        StringBuilder sb = new StringBuilder();
        for (String num : stnumbers) {
            sb.append(num);
        }
        return sb.toString();
    }
}
  1. numbers[] 요소들을 String 형식으로 변환한다
String[] stnumbers = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            stnumbers[i] = String.valueOf(numbers[i]);
        }
  1. 두 요소를 비교하여 내림차순으로 정렬한다.
/** 두 값을 이어 붙여서 비교
        1. 앞(o2+o1) > 뒤(o1+o2) = 음수 -> o1, o2 순서 그대로
        2. 앞(o2+o1) < 뒤(o1+o2) = 양수 -> o1, o2 순서 바꿔서(o2, o1)
        3. 앞(o2+o1) == 뒤(o1+o2) = 0 -> o1, o2 순서 그대로
        즉, compareTo()의 반환값이 음수 or 0이면 순서 그대로(o1, o2), 양수면 순서 바꿔서(o2, o1)
        */
        Arrays.sort(stnumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
  1. 만약 numbers[]의 모든 요소가 0이라면 "0"을 반환한다.
 if (stnumbers[0].equals("0")) {
           return "0";
        }
  1. 내림차순 정렬된 String 배열의 요소들을 하나의 String 값으로 변환하여 반환한다.
StringBuilder sb = new StringBuilder();
        for (String num : stnumbers) {
            sb.append(num);
        }
        return sb.toString();