본문 바로가기
자료구조 & 알고리즘/문제 풀이 (프로그래머스)

가장 큰 수

by 정구정구 2026. 6. 22.

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

정답 코드 (남이 작성한 코드)

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        // 결과를 저장할 StringBuilder를 생성
        StringBuilder sb = new StringBuilder();

        // int 배열을 String 배열로 변환
        String[] stringNums = Arrays.stream(numbers)
                .mapToObj(String::valueOf)
                .toArray(String[]::new);

        // 문자열을 더한 값이 큰 순서대로 정렬(내림차순)
        Arrays.sort(stringNums, (a, b) -> (b + a).compareTo(a + b));

        // 만약 가장 큰 값이 "0"인 경우
        if (stringNums[0].equals("0")) {
            // "0" 반환
            return "0";
        }
        
        // 반복문을 활용하여 정렬된 문자열 순서대로 이어 붙이기
        for (String s : stringNums) {
            sb.append(s);
        }

        // StringBuilder 값을 String으로 변환
        String answer = sb.toString();
    
        // answer 반환
        return answer;
    }
}

 

 

문제 풀이

 문제는 간단했지만 알고리즘을 만드는데, 꽤 오랜 시간 고민 했고, 결국 풀지 못 했다. 다른 사람들의 풀이를 보니 comparator를 이용해서 풀었는데, 이를 분석하며 공부하여, 다음에 비슷한 문제를 마주했을 때는 제대로 풀어봐야겠다. 

        // 문자열을 더한 값이 큰 순서대로 정렬(내림차순)
        Arrays.sort(stringNums, (a, b) -> (b + a).compareTo(a + b));

 

핵심 코드는 위 코드인데, 

Arrays.sort(stringNums, comparator);

 

comparator로 (a, b) -> (b + a).compareTo(a + b)가 들어간 코드이다. 이 코드가 돌아가는 예시를 보자.

int[] numberString = {"3", "30", "34"}

Arrays.sort(numberString, (a, b) -> (b + a).compareTo(a + b));

 

위와 같이 코드를 실행하면

 

1. 3과 30 비교

2. 330(a+b), 303(b+a)

3. (a+b) > (b+a) 이므로 3, 30 순으로 정렬

4. 3과 34 비교

5. 334(a+b), 343(b+a)

6. (a+b) < (b+a) 이므로 34, 3 순으로 정렬

7. 결과 = {"34","3","30"}