🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/Programmers

[프로그래머스/Programmers] 가장 큰 수 (Java - 정렬 - Lv2)

JONG_UK 2023. 2. 1. 16:34
728x90
반응형
SMALL

가장 큰 수
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


⭐️ 코드

- 프로그래머스에서 빌드할 때는 출력문은 다 지우고 하셔야 합니다.

package Programmers.Level_2;

import java.util.*;

public class PL2_17 {
    // Level2 가장 큰 수
    public String solution(int[] numbers) {
        // numbers 배열을 String 변환
        String[] sArr = new String[numbers.length];
        for (int i = 0; i < sArr.length; i++) {
            sArr[i] = Integer.toString(numbers[i]);
        }

        System.out.println(Arrays.toString(sArr));

        // String으로 변환된 sArr[] 원소들을 사전순으로 내림차순 정렬
        // Arrays.sort 재정의
        Arrays.sort(sArr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2); // 내림차순 [9, 5, 34, 3, 30]
//                return (o1+o2).compareTo(o1+o2); // 오름차순 [3, 30, 34, 5, 9]
//                return (o1+o2).compareTo(o2+o1); // [30, 3, 34, 5, 9]
//                return (o2+o1).compareTo(o2+o1); // [3, 30, 34, 5, 9]
//                return (o2).compareTo(o1); // 내림차순 [9, 5, 34, 30, 3]
//                return (o1).compareTo(o2); // 오름차순 [9, 5, 34, 30, 3]
            }
        });

        System.out.println(Arrays.toString(sArr));

        // 문자열 합치기
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < sArr.length; i++) {
            sb.append(sArr[i]);
        }

        String answer = sb.toString();

        // 0으로 시작하면 모두가 0일테니까 0으로 반환
        if (answer.startsWith("0")) {
            return answer = "0";
        }

        return answer;
    }

    public static void main(String[] args) {
        PL2_17 p2 = new PL2_17();
        int[] numbers = {3, 30, 34, 5, 9};
        System.out.println(p2.solution(numbers)); //9 5 34 3 30
    }
}

💡 문제 풀이

오랜만에 정말 어려운 문제를 풀게 됐다.

솔직히 하루 정도 생각하다 포기했었는데 다시 도전해 봤다. 물론 정답을 보지 않고는 풀기가 힘들었다. 

Arrays.sort()의 Comparator를 사용해야 하는 문제였고, 그것을 재정의 해야 했었다.

 

Arrays.sort(arr, Collections.reverseOrder())를 사용하려 했던 사람들이 있을 것이다.

Collections 메서드는 Wrapper 클래스에만 사용 가능하다.
ex) Integer, Character, String...

char, double, long, int 같은  PrimitiveType의 배열에는 적용이 불가능하니 꼭 명심해 두자.

 

문제를 설명하기 앞서 가장 중요하게 볼 부분은 아래다.

Arrays.sort -> Comparator
Arrays.sort(sArr, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return (o2+o1).compareTo(o1+o2); // 내림차순 [9, 5, 34, 3, 30]
//                return (o1+o2).compareTo(o1+o2); // 오름차순 [3, 30, 34, 5, 9]
//                return (o1+o2).compareTo(o2+o1); // [30, 3, 34, 5, 9]
//                return (o2+o1).compareTo(o2+o1); // [3, 30, 34, 5, 9]
//                return (o2).compareTo(o1); // 내림차순 [9, 5, 34, 30, 3]
//                return (o1).compareTo(o2); // 오름차순 [9, 5, 34, 30, 3]
    }
});

Arrays.sort() 메서드를 원하는 정렬 방식으로 바꾸고 싶다면 , Comparator 익명인터페이스를 명시해 줘야 하고, java.util.Comparator를 구현한 Class내 compare() 메서드를  원하는 정렬조건으로 @Override 해야 한다. 

 

만약 입력되는 값이 3과 30이라면 o1 = 3, o2 = 30이 된다.

둘 다 문자열 이기 때문에 o2+o1 = 303, o1+o2 = 330이 되고, 두 개를 비교했을 때 더 큰 값이 o1+o2 = 330이기 때문에 3이 더 앞에 와야 한다고 판단하여 정렬된다. 

 

그다음에는 또 다른 문자로 변형된 숫자와 그전 수가 붙어 비교가 이루어지고, 결과를 반환한다.

 

우리가 정렬 방식을 두 문자를 붙이는 방식으로 하였기 때문에 이렇게 변경되는 것이라는 걸 명심하자.

 

솔직히 아직 뭔지는 정확히 이해할 수 없었다. 아래 두 블로그를 참고하여 공부를 좀 더 해 보았다.

 

 

[Java] 배열(Array) 정렬 하기 ( 오름차순,내림차순 등 )

| Arrays.sort() java.util.Arrays 유틸리티 클래스를 사용하면 배열(Array)을 정렬, 복제하거나, List로 변환 하는 등의 작업을 쉽게 처리 할 수 있습니다. 해당 클래스의 sort() 메서드를 사용하면 쉽게 오름

ifuwanna.tistory.com

 

 

[java] 자바 배열 / 객체 정렬 (comparable, comparator도 같이 알아보자)

배열에 값을 넣는 방법은 알겠는데 프로그래밍을 하다 보면 배열의 정렬이 때때로 필요로 합니다. 또한 타입이 객체 타입인 경우에도 원하는 기준대로 정렬을 할 수 있도록 알아보도록 하겠습

junlab.tistory.com

 

// 문자열 합치기
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sArr.length; i++) {
    sb.append(sArr[i]);
}

String answer = sb.toString();

// 0으로 시작하면 모두가 0일테니까 0으로 반환
if (answer.startsWith("0")) {
    return answer = "0";
}

마지막으로 문자열 관련 연산은 StringBuilder로 하는 것이 빠르기 때문에 StringBuilder를 사용하고, 조건문은 문자열이 0으로 시작하면 모두 0으로 되어있을 것이기 때문에 문자열 "0"으로 바꿔서 다시 리턴해준다.


👀 후기

진짜 너무 어려웠고 정렬에 대해 조금 알았다고 생각하기 때문에 다른 문제도 도전해 보도록 하겠다!!

728x90
반응형
LIST