알고리즘/프로그래머스

프로그래머스 level2 - 가장 큰 수

programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

1. 유형

정렬

 

2. 풀이

 

추상화

- 정렬

- 문자열로 변환

 

다른 정렬문제와는 다르게 Int를 정렬하는게 아니라, 문자열을 정렬한다는 점이 색달랐다.

 

static class Node implements Comparable<Node>{
        String n;
        Node(String n){
            this.n=n;
        }
        
        @Override
        public int compareTo(Node o){
            int a = Integer.valueOf(this.n+o.n);
            int b = Integer.valueOf(o.n+this.n);
            return -(a-b);
        }
    }

[6 10 2]인 경우,

 

위 코드에서 "6" + "10" > "10" + "6" 이다. 따라서 6 10 순으로 정렬돼야 한다.

 

이렇게 정렬하면 된다.

 

이떄, 반례가 존재한다. [0 0 0 0 0]처럼 0이 여러번 나올 수 있다.

 

그래서 마지막에 00000은 0으로 치환해줘야 한다.

 

3. 코드

import java.util.*;
class Solution {
    static class Node implements Comparable<Node>{
        String n;
        Node(String n){
            this.n=n;
        }
        
        @Override
        public int compareTo(Node o){
            int a = Integer.valueOf(this.n+o.n);
            int b = Integer.valueOf(o.n+this.n);
            return -(a-b);
        }
    }
    public String solution(int[] numbers) {
        String answer = "";
        ArrayList<Node> list = new ArrayList<>();
        for(int i=0; i<numbers.length; i++){
            list.add(new Node(String.valueOf(numbers[i])));
        }
        Collections.sort(list);
        for(int i=0; i<list.size(); i++){
            answer+=list.get(i).n;
        }
        if(answer.charAt(0) == '0')
            answer = "0";
        return answer;
    }
}