가장 큰 수

이윤설·2024년 4월 15일



제출코드

시간초과 없음

모범답안

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        //문자열 리턴을 해줄 스트링배열 생성
        String[] str = new String[numbers.length];
        
        //int배열 String배열로 변환
        for(int i = 0; i < numbers.length; i++){
            str[i] = String.valueOf(numbers[i]);
        }     
        
        //내림차순 정렬
        Arrays.sort(str, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return (b+a).compareTo(a+b);
                //오름차순 정렬 (o1+o2).compareTo(o1+o2);
            }
        });
        
        //0값이 중복일경우 ex){0,0,0}
        //답이 000이 나오면 안되므로 첫번째값이 0이면 0을 리턴
        if (str[0].equals("0")) return "0";
        
        //0이 아니면 문자열을 더해준다.
        for(String s: str) answer += s;
 
        return answer;
    }
}
        Arrays.sort(str, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return (b+a).compareTo(a+b);
                //오름차순 정렬 (o1+o2).compareTo(o1+o2);
            }
        });

배운점

  • (b+a).compareTo(a+b)는 내림차순 정렬을 의미힌다.
    배열이 [1,3,2]일 때를 예를 들어보자.

a) (31).compareTo(13) : 양수 -> 3은 1보다 정렬 순서에 앞선다.
b) (21).compareTo(12) : 양수 -> 2는 1보다 정렬 순서에 앞선다.
c) (23).compareTo(32) : 음수 -> 3은 2보다 정렬 순서에 뒤쳐진다.

따라서 정렬 후의 모습은 [3,2,1]이다.

(a+b).compareTo(b+a)는 오름차순 정렬을 의미한다.
정렬 후의 모습은 [1,2,3] 이다.

  • 문자열끼리 어떻게 compare(비교)할 수 있는걸까????????????

문자열 간 대소비교는 문자열을 구성하는 각 문자의 유니코드 값(또는 ASCII 값)을 기반으로 수행된다. 문자열 비교는 첫 번째 문자부터 시작하여, 두 문자열 중 하나가 다른 문자열보다 더 작은 문자(유니코드 값이 더 작은 문자)를 가지고 있을 때, 그 문자열이 더 작다고 판단한다. 만약 비교하는 문자가 동일하면, 다음 문자로 넘어가 비교를 계속한다. 이 과정은 두 문자열 중 하나가 끝날 때까지 또는 비교하는 도중 두 문자가 다를 때까지 계속된다.

예를 들어, 문자열 '12'와 '11'을 비교할 때, 첫 번째 문자인 '1'은 두 문자열에서 동일하므로, 비교는 두 번째 문자로 넘어간다. 두 번째 문자에서 '2'는 '1'보다 유니코드 값이 크므로, '12'가 '11'보다 크다고 판단된다. 이러한 방식으로 문자열 간 대소비교가 가능하다.

문자열 비교는 사전 순서를 따르는데, 이는 숫자를 문자열로 변환했을 때의 숫자값의 크기와는 다를 수 있다.
예를 들어, 숫자로는 2 > 11이지만, 문자열로는 "2" < "11"다
(사전 순으로 "11"이 "2"보다 앞선다).

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글