https://programmers.co.kr/learn/courses/30/lessons/42746?language=java 

 

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

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

programmers.co.kr



풀이 과정


  1. 핵심은 정렬하기 전에 숫자를 반복해서 4자리로 맞추어주는 것이다. 맞추어주지 않고 정렬한다면 값 자체로 큰 값 순서대로 정렬이 되기 때문이다.
    • 1 -> 1111, 2 -> 2222, 10 -> 1010, ...
  2. 따라서, 반복해서 만들어 준 숫자, 실제 숫자를 저장하는 클래스를 만들어 준 다음, 입력받은 numbers의 값들을 클래스로 매핑해서 리스트로 저장한다.
  3. 다음으로 반복해서 만들어 준 숫자 기준으로 내림차순 정렬한다.
  4. 정렬된 리스트를 기준으로, 하나씩 실제 숫자를 꺼내서 정답 문자열에 붙여준다. 단, 이 때 맨 앞자리가 0인 경우는 0을 출력시켜 주면 된다.
    1. 0이 3번 나온 경우 000 리턴이 아닌 0 리턴임에 유의!!

소스 코드


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Element {
    int value;
    int realValue;

    public Element(int realValue, int value) {
        this.realValue = realValue;
        this.value = value;
    }
}

class Solution {
    public String solution(int[] numbers) {
        String answer = "";

        List<Element> elementList = Arrays.stream(numbers)
                .mapToObj(n -> {
                    String numStr = Integer.toString(n);
                    int idx = 0;
                    int value = 0;
                    while (idx < 4) {
                        value *= 10;
                        value += (Character.digit(numStr.charAt((idx++) % numStr.length()), 10));
                    }
                    return new Element(n, value);
                })
                .collect(Collectors.toList());

        elementList.sort((p1, p2) -> {
            return -Integer.compare(p1.value, p2.value);
        });

        for (Element e : elementList) {
            answer += e.realValue;
        }

        if (answer.charAt(0) == '0')
            return "0";
        return answer;
    }
}

'알고리즘[Java] > 프로그래머스' 카테고리의 다른 글

[ Lv 2 ] 튜플  (0) 2022.01.29
[ Lv 2 ] 짝지어 제거하기  (0) 2022.01.28
[ Lv 3 ] [ DP ] 보행자 천국  (0) 2021.12.21
[ Lv 2 ] [ BackTracking ] 단체사진 찍기  (0) 2021.12.19

+ Recent posts