LV2. 가장 큰 수

강창민·2022년 5월 26일
0

프로그래머스

목록 보기
24/26

문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예


나의 풀이
1. 우선 ,주어진 numbers배열을 차례로 받아서 문자열로 변환했다
2. 문자열로 반환한 numbers배열을 List에 저장하여 내림차순으로 정렬하였다.

이 때, 예를들어 30과 3이 있다고 가정하면, 내림차순으로 정렬할 때, 30-3 이렇게 된다. 하지만 이 둘을 이어붙였을 때 큰 수는 3-30으로 정렬될 때이므로 테스트 케이스를 통과하지 못했다.
3. 문제의 제한 조건에서 numbers의 원소는 최대 1000이므로. 주어진 원소를 3번 연속 이어붙여 비교하였다. 3번 이어붙인 이유는 원소의 크기가 최대 1000이므로 만약 원소가 한자리 수일 때를 가정해서 조건을 준 것이다. 그러면 자연스럽게 재정의한 compare함수 내에서 세자리수까지 비교가 되므로, 내가 원하는 대로 정렬할 수 있다.

예를 들면, 30과 3을 비교할 때 303030333을 비교한다. 그러면 3이 앞에 오게되어 나의 의도대로 정렬할 수 있었다.

👀주의사항

  • 길이가 2이상numbers의 모든 원소가 '0'이라면, 마지막의 return값은 00000..... 처럼 0이 무수히 많이 나오는 케이스가 되므로 통과하지 못한다. 그러므로 마지막에 정렬한 List의 첫 번째 원소가 0이라면 그냥 answer = "0"을 return해줌으로써, 예외처리를 해주었다.
import java.util.*;
import java.lang.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        int sum = 0;
        ArrayList<String> list = new ArrayList<>();
        for(int i=0;i<numbers.length;i++){
            list.add(Integer.toString(numbers[i]));
        }
        Collections.sort(list, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                return (s2+s2+s2).compareTo(s1+s1+s1);
            }
        });

        for(int i=0;i<list.size();i++){
            answer = answer + list.get(i);
        }
        if(answer.charAt(0)=='0'){
            answer = 0 + "";
        }
        
        return answer;
    }
}
profile
오늘 그것을 할 수 없다면, 대체 무슨 근거로 내일 그것을 할 수 있다고 생각하는가?

0개의 댓글