알고리즘 풀이/프로그래머스

[level2] 프로그래머스 - 가장 큰 수(JAVA)

데롱디롱 2021. 9. 20. 23:48
728x90

 

 

[ 문제 풀이 ]

- int형 배열을 String형으로 바꿔주어 숫자 자체가 아닌 앞자리의 크기로 비교한다.

 

 

- 문자열을 내림차순으로 정렬한다.

그냥 n2.compareTo(n1)만을 하면 다음과 같다.
[ 9, 5, 34, 30, 3 ]

여기엔 문제가 존재한다.
비록 숫자가 작지만 먼저 오는게 더 큰 경우가 생길 수도 있다.
[ 34, 30, 3 ] 이 경우, [ 34, 3, 30 ]이 되어야 한다는 것이다.
34303 < 34330이기 때문이다.

그렇기 때문에 단순 비교가 아니라
n1에 n2를 더한 것n2에 n1를 더한 것을 비교하여 내림차순 정렬해주어야 한다.
(n2 + n1).compareTo(n1 + n2)

 

- String 배열을 문자열로 바꿔준다.

Arrays.stream( String 배열 ).collect(Collectors.joining())

 

- 만약 내림차순으로 정렬한 배열의 맨 앞 숫자가 0이라면, "0"을 출력한다.

 

 

[ 전체 코드 ]

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public String solution(int[] numbers) {
        String[] nums = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++)
            nums[i] = numbers[i] + "";

        Arrays.sort(nums, (n1, n2) -> (n2 + n1).compareTo(n1 + n2));

        return nums[0].equals("0") ? "0" : Arrays.stream(nums).collect(Collectors.joining());
    }
}

 

 

[ 케이스 공유 ]

만약 테스트케이스 11번만 틀리셨다면, 0인 경우를 처리하지 않으셨을 수도 있습니다.