codingtest

가장 큰 수

2026-08-06
2분 분량
JAVA프로그래머스

문제 링크

문제 요약

  • 0 또는 양의 정수 배열이 주어진다
  • 배열의 숫자를 순서대로 이어 붙여 만들 수 있는 가장 큰 수를 문자열로 반환한다
  • 정답이 클 수 있어서 문자열로 반환한다

문제 풀이

처음에는 숫자를 그냥 큰 값부터 정렬해서 이어 붙이면 될 거라 생각했다.

하지만 이 방식은 틀렸다.

문제에 나온 예시처럼 [3, 30, 34, 5, 9]에서 숫자 크기로만 정렬하면 9, 5, 34, 30, 3 순서가 되어 9534303이 나온다.

하지만 실제 정답은 9534330이다. 30과 3처럼 자리수가 다른 두 수는 숫자 크기 비교로 순서를 정할 수 없다.

이 문제의 핵심은 두 숫자를 이어 붙였을 때 어느 순서가 더 큰 값을 만드는지로 비교해야 한다는 점이다.

a와 b 두 수를 비교할 때 a+b와 b+a를 문자열로 만들어 비교하면 된다.

  • b+a가 더 크면 b가 앞에 와야 한다
  • 그렇게 정렬한 뒤 순서대로 이어 붙이면 가장 큰 수가 만들어진다

정렬 후 가장 앞자리가 "0"이면 나머지도 전부 0이라는 뜻이므로 "0" 하나만 반환한다.

최종 코드

java
import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String[] values = new String[numbers.length]; // 이어붙이기 비교를 위해 문자열로 다룬다

        for (int i = 0; i < numbers.length; i++) { // 각 숫자를 문자열로 변환
            values[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(values, (a, b) -> (b + a).compareTo(a + b)); // b+a 가 a+b 보다 크면 b를 앞에 오도록 정렬
        if (values[0].equals("0")) { // 가장 큰 자리가 0이면 전부 0이라는 뜻
            return "0";
        }

        StringBuilder result = new StringBuilder();

        for (String value : values) { // 정렬된 순서대로 이어 붙인다
            result.append(value);
        }

        return result.toString();
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-08-23

택배상자

order 배열은 택배 기사님이 원하는 상자 적재 순서다 기존 컨테이너 벨트는 1번부터 순서대로만 꺼낼 수 있다 보조 벨트는 스택처럼 마지막에 넣은 것부터 꺼낼 수 있다 원하는 순서대로 최대한 실을 수 있는 상자 개수를 구하는 문제다 처음에는 기존 벨트를 실제 리스트로 만들어…

코딩 테스트2026-08-23

롤케이크 자르기

topping 배열은 롤케이크에 일렬로 올라간 토핑 번호다 한 지점을 잘라 두 조각으로 나눴을 때, 양쪽 토핑 종류 수가 같아야 공평하게 나눈 것이다 공평하게 자를 수 있는 방법의 수를 구하는 문제다 처음에는 자르는 위치마다 왼쪽과 오른쪽 배열을 나눠서 각각 서로 다른 토핑…

코딩 테스트2026-08-23

할인 행사

want, number 배열로 정현이가 원하는 제품과 수량을 표현한다 discount 배열은 XYZ 마트가 매일 할인하는 제품 목록이다 연속된 10일 동안 할인 제품 종류와 수량이 want, number와 정확히 일치해야 회원가입할 수 있다 그런 시작일이 총 몇 번 있는지…

코딩 테스트2026-08-23

숫자 변환하기

자연수 x를 y로 바꾸는 데 x+n, x2, x3 세 가지 연산을 쓸 수 있다 x를 y로 바꾸는 최소 연산 횟수를 구하는 문제다 만들 수 없으면 -1을 반환한다 처음에는 x에서 시작해서 세 가지 연산을 재귀적으로 다 시도해보고 y에 도달하는 경로 중 가장 짧은 걸 고르면…