프로그래머스 가장 큰 수

박은빈·2022년 10월 25일

코딩

목록 보기
11/19

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

숫자가 들어있는 배열을 준다
거기서 숫자를 더하는게 아닌 이어붙여서 가장 큰 수를 찾는 문제

풀이과정

사실 이 문제는 계속 고민하다가 결국 모르겠어서 검색을해봤다

그래도 풀었던 과정을 나열해본다

일단 가장 큰 수가 오려면 9가 앞에 위치해야한다
하지만 995,93,9 이렇게 숫자가 있을때
995939보다 999593이 더 크다
이유는 일의자리가 큰게 앞에와야지 더 크기때문이다

그래서 먼저 9부터 1까지 반복문을 돌렸다
그리고 그 안에서 999인수(무조건 1등) 99(무조건2등)을 골라내고 나머지 수를 차례대로 if문으로 골라냈다

내가 생각했던 우선순위는 다음과 같았다
999 > 99 > 9 > 99x > 9x > 989 > 98 > 8 > 98x > 8x ...

이렇게 계산하면 패턴이 보이는거같지만 이 우선순위에는 틀린점이 존재한다

97,989,98,8이 있을때
97989988보다 98998897이 더 크다
정말 이러한 예외가 차고 넘쳐서 다른 방법은 없을까 고민하다가 결국 검색을 해보았다

밑에서부터는 검색을 해서 알아낸 결과이다

정렬이기때문에 sort()를 이용한다
내가 생각했던 sort()는 오름차순 정렬만 되는줄 알았지만
이 sort()는 Comparator<>()라는 인터페이스의 확장을 통해 정렬이 이루어진다. 즉 Comparator를 내가 확장을하면 내 스스로 새로운 규칙을 만들 수 있다는것이다

그리고 규칙을 만드는 방법은 sort(배열, 내부클래스)를 이용한다

코드

public String solution(int[] numbers) {
        String answer = "";
        String[] arr = new String[numbers.length];

        for(int i=0; i< numbers.length; i++) {
            arr[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2);
            }
        });

        if(arr[0].equals("0")) {
            return "0";
        }

        for(String x : arr) {
            answer += x;
        }

        return answer;
    }

숫자를 이어붙이기때문에 int가 아닌 String으로 변환을 해주어서 배열에 집어넣었다

그리고 sort를 이용해 Comparator를 오버라이드해서 새로운 규칙을 적용해주었다.

comparaTo메서드를 이용해 o1과 o2를 순서를 바꿔서 합친것을 비교해주었다

즉 o1 = 10, o2 = 20일 경우
(2010).compareTo(1020)으로 계산이 된다
여기서 기준값(2010)이 1020보다 크면 1, 작으면 -1 같으면 0을 반환한다.

여기서 클때1을 반환하고 sort의 제일 앞부분에 정렬이 되게된다
우리는 새로운 기준을 숫자를 이어붙여서 큰 수를 앞에서부터 정렬하게 만들었다.

그리고 중간에 0에관한 if문은 숫자가 0도 들어갈수있고
0으로만 이루어진 테스트케이스가 있을수도있는데
이때 결과가 0이아닌 000000...이렇게 나올수도있기때문에 저 if문을 만들었다

그리고 마지막으로 배열을 순회하며 문자열을 이어붙이면 끝이다

나에게 정말 어려운문제인거같다
그리고 새로운 사실도 많이 알아서 좋았다

profile
안녕하세요

0개의 댓글