티스토리 뷰

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

 

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

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

programmers.co.kr

아이디어

서로 이어 붙였을 때 더 큰 수를 만들기 위해 다음과 같은 방법을 사용하였다.

문제에서 주어진 조건에 의해 배열의 각 원소는 [0, 1000]의 범위를 가지므로, 각각의 원소가 모두 네 자릿수가 되도록 반복해서 이어붙여준 reformattedValue를 만들었고, 이를 기준으로 주어진 배열을 내림차순 정렬하였다.

 

그러면 새로 내림차순으로 정렬된 배열을 순회하며 기존 원소값을 이어붙여주는 것으로 끝.

 

단, 문제에서 요구하는 결과값이 숫자이기 때문에(String은 overflow발생을 방지하기 위한 목적일 뿐) 주어진 배열이 {0, 0, 0, 0}과 같은 형태라면 결과값으로 "0000"이 아닌 "0"이 반환되어야 한다. 

 

소스코드

import java.util.Arrays;

public class Solution {
    public String solution(int[] numbers) {
        Data[] data = new Data[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            data[i] = new Data(numbers[i]);
        }

        Arrays.sort(data);
        if (data[0].getValue() == 0) {
            return "0";
        }

        StringBuilder answer = new StringBuilder();
        for (Data datum : data) {
            answer.append(datum.getValue());
        }

        return answer.toString();
    }
}

class Data implements Comparable<Data> {
    private final int value;
    private final int reformattedValue;

    Data(int value) {
        this.value = value;
        this.reformattedValue = this.reformat(value);
    }

    private int reformat(int num) {
        int answer = num;
        if (num < 10) {
            for (int i = 0; i < 3; i++) {
                answer *= 10;
                answer += num;
            }
        } else if (num < 100) {
            answer *= 100;
            answer += num;
        } else if (num < 1000) {
            answer *= 10;
            answer += (num / 100);
        }
        return answer;
    }

    public int getValue() {
        return this.value;
    }

    public int getReformattedValue() {
        return this.reformattedValue;
    }

    @Override
    public int compareTo(Data o) {
        return o.getReformattedValue() - this.getReformattedValue();
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함