기초 공부 (언어 및 알고리즘)/알고리즘 (Java)

[프로그래머스/Java] 가장 큰 수(정렬 문제) 풀이

iinana 2025. 3. 10. 15:33
728x90

프로그래머스 알고리즘 고득점 Kit의 정렬 파트 문제 중 하나인 '가장 큰 수'를 자바로 풀어보았다.

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

 

프로그래머스

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

programmers.co.kr

 

 

 비슷한 종류의 방법을 계속 생각했지만, 두 문자열을 합쳐서 비교하는 것을 떠올리지 못해서 사소한 오류에 부딪히다가 결국 두 문자열을 합쳐서 비교하는 풀이에 이르렀다. 

 우선 int 값을 String으로 바꾸어서 다루었다. 각 숫자들의 각 자릿수들을 더 쉽게 다루기 위함이었다. 그리고 두 문자열을 합친 후 둘 중 큰 숫자를 파악했다. 두 문자열 중 어떤 쪽이 더 앞으로 가야 하는지 정해야 하는 문제이고, 만약 한 문자열이 끝날 때까지 모두 같은 수였다면, 서로 다른 수가 바로 뒤에 나왔을 때 뭐가 더 클지를 결정해야 한다. 따라서 두 문자열을 합쳐서 뭐가 더 클지를 결정하는 것이다. 

 마지막에 정렬된 문자열 중 첫번째가 0이면 "0"을 바로 리턴해줬는데, 0만 중복으로 있어 "00", "000" 등으로 출력되는 것을 막기 위함이다. 그렇지 않을 경우 StringBuilder로 모든 String을 연결하여 리턴해준다. String이 아닌 String Builder를 사용한 이유는 아래 글을 읽어보면 이해할 수 있다. 

https://programming-diary-ina.tistory.com/48

 

[JAVA] StringBuilder로 문자열 조작하기

StringBuilder는 자바에서 사용 가능한 문자열과 관련된 주요 클래스 중 하나이다. 이 클래스는 효율적인 문자열 조작 기능이 필요할 때 사용하게 된다. 그렇다면 왜 자바에서는 특별히 효율적인 문

programming-diary-ina.tistory.com

 

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        String[] nums = Arrays.stream(numbers)
            .mapToObj(String::valueOf)
            .toArray(String[]::new);
        
        Arrays.sort(nums, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                if (a.equals(b)) return 0;
                String ab = a + b;
                String ba = b + a;
                int len = ab.length();
                for (int i = 0; i < len; i++) {
                    if (ab.charAt(i) != ba.charAt(i))
                        return ba.charAt(i) - ab.charAt(i);
                }
                return 0;
            }
        });
        
        if (nums[0].equals("0")) return "0";
        for (String n : nums) {
            answer.append(n);
        }
        return answer.toString();
    }
}
728x90