알고리즘/프로그래머스

[프로그래머스] 가장 큰 수_JAVA

jimkwon 2022. 2. 22. 14:08
반응형

문제 링크

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

 

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

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

programmers.co.kr

 

정수를 이어 붙여 가장 큰 수를 만들기 위해서는 맨 앞자리의 숫자가 중요하다.

만약 앞자리의 숫자가 같다면 그 다음 숫자의 크기가 중요할 것이다.

 

ex) [3, 30, 34, 5, 9] 프로그래머스 예제

3과 30을 두고 보면 3을 앞에 두는게 더 좋을 것이다. 330 vs 303

허나 3과 34는 34를 앞에 두는게 더 좋다. 343 vs 334

 

숫자를 비교하기에는 서로 자릿수가 다를 경우들이 존재한다.

따라서 필자가 처음 생각해낸 방법은 '자릿수를 맞춰주는'것이다.

최대 자리수는 1000 <- 4자리 이기 떄문에 남은 자릿수를 맨 앞숫자로 맞춰주는 것이다.

위의 예제로 사용하면 

3333 3033 3433 5555 9999

이렇게 만들고 정렬하면 이어 붙일 때 가장 큰 순서대로 알 수 있게 된다!

 

따라서 HashMap<해당 숫자의 원래 index, 자릿수를 맞춰 변형한 숫자>에 값을 넣어두고 정렬하면.

<9999, 4> <5555, 3> <3433, 2> <3333, 0> <3033, 1> 순서대로 정렬된다.

value값의 index를 이용해서 해당 index 순으로 이어붙이면 완성이다.

9 + 5 + 34 + 3 + 30 = 9534330

 

다만, 10 101의 경우 둘다 1011이 되는 문제점이 발생했다.

이러한 문제를 방지하기 위해 2자리 수는 자기 자신을 그대로 복사하여 자릿수를 맞춰주도록 했다.

1010 1011

 

import java.util.List;
import java.util.LinkedList;
import java.util.HashMap;
import java.util.Map;
import java.util.Comparator;
import java.util.Collections;
import java.util.ArrayList;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        HashMap<Integer, Integer> map = new HashMap<>();
        String [] nums = new String[numbers.length];
        String num;
        
        for (int i = 0; i < numbers.length; i++) {
            nums[i] = Integer.toString(numbers[i]);
        }
        for (int i = 0; i < nums.length; i++) {
            num = nums[i];
            if (num.length() == 2)
                num += num;
            else {
                for (int j = num.length(); j != 4; j++) {
                    num += nums[i].charAt(0);
                }
            }
            map.put(i, Integer.parseInt(num));
        }
        
        // 해시 맵 정렬 (key 기준으로) 
        List<Map.Entry<Integer, Integer>> entryList = new LinkedList<>(map.entrySet());
        entryList.sort(new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
	        return o2.getValue() - o1.getValue();
            }
        });
        
        for (Map.Entry<Integer, Integer> entry : entryList) {
            answer += nums[entry.getKey()];
        }
        if (answer.charAt(0) == '0')
					return "0";
        return answer;
    }
}