[백준/java] 16496. 큰 수 만들기

rejs·2025년 2월 19일

아이디어

맨 처음에는 숫자가 아니라 문자열처럼 취급하면 된다고 생각했다.
그러니까 123이 아니라 ABC처럼 보고 사전순의 역순으로 정렬하면 되겠다고 생각했다.
즉 두 문자열의 길이가 같으면 각 위치의 원소를 하나하나 비교하면 된다.

그런데 길이가 다른 두 원소는 어떻게 정렬해야할지 고민하는데 시간이 좀 걸렸다

/*
반례모음
2
54321 543
---
54354321

2
123 12345
---
12345123
*/

543, 54321이 주어졌을 때 길이가 짧은 543이 앞에 나와야 더 큰 숫자가 된다
123, 12345가 주어졌을 때 길이가 긴 12345가 앞에 나와야 더 큰 숫자가 된다

이걸 숫자 2개 붙여보기 전에 어떻게 알지? => 그렇다면 붙여보고 결정하면 되는 거 아닌가?
그래서 숫자 2개 붙여서 정렬해보니까 풀렸다.

코드로 표현하면 아래처럼 된다

arr.sort((o1, o2) -> {
            /*
            	543과 54321을 비교X / 54354321이랑 54321543을 비교 O
				123이랑 12345을 비교 X / 12312345이랑 12345123을 비교 O 
            */
            String o1First = o1 + o2;
            String o2First = o2 + o1;
            
            int ret = 0;
            for (int i = 0; i < o1First.length(); i++) {
                if (ret != 0) {
                    return ret;
                }
                char a = o1First.charAt(i);
                char b = o2First.charAt(i);
                ret = -Character.compare(o1First.charAt(i), o2First.charAt(i));
            }
            return ret;
        });

java

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        int zeros = 0;
        String ZERO = "0";
        List<String> arr = new ArrayList<>();
        for(int i=0;i<n;i++){
            String now = st.nextToken();
            arr.add(now);
            if(now.equals(ZERO)){
                zeros++;
            }
        }
        arr.sort((o1, o2) -> {
            String o1First = o1 + o2;
            String o2First = o2 + o1;
            int ret = 0;
            for (int i = 0; i < o1First.length(); i++) {
                if (ret != 0) {
                    return ret;
                }
                char a = o1First.charAt(i);
                char b = o2First.charAt(i);
                ret = -Character.compare(o1First.charAt(i), o2First.charAt(i));
            }
            return ret;
        });

        if(zeros != n){
            for(String i : arr){
                sb.append(i);
            }
        }else {
            sb.append(ZERO);
        }

        bw.write(sb.toString());
        br.close();
        bw.close();
    }
}

0개의 댓글