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

0

[문제링크 - 프로그래머스 - 가장 큰 수] https://school.programmers.co.kr/learn/courses/30/lessons/42746

class Solution {
    public String solution(int[] numbers) {
        StringBuilder sb = new StringBuilder();
        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 o1, String o2) {
                return (o2+o1).compareTo(o1+o2);
            }
        });

		//내림차순으로 정렬된 배열을 순서대로 붙임
        if(str[0].equals("0")) //모든 값이 0일 경우, 0을 출력
            sb.append(0);
        else {
            for (int i = 0; i < str.length; i++) {
                sb.append(str[i]);
            }
        }
        return sb.toString();
    }
}



문제 파악

[6, 10, 2] 로 예시

  • 가장 큰 수가 되기 위해서는 앞자리가 가장 큰 수가 앞에 와야 한다.
  • 단순히 배열 요소가 큰 순서대로 둘 경우, 10, 6, 2 순서로 1062로 가장 큰 수가 될 수 없다.


문제 해결

  1. 원소들의 앞자리를 가져오기 위해서 int[]에서 String[]으로 변환해야한다.
    • 10인 경우 앞자리인 1만 가져온다.
  2. 정렬 기준을 변경하기 위해 compare() 사용한다.
    • 비교하는 두 숫자를 앞, 뒤로 번갈아가며 이어붙인 것을 기준으로 비교한다.
    • "610".compateTo("106") 할 경우 6이 1보다 크므로 양수 출력.
      -> 6(o1),10(o2) 중에 10이 뒤로 간다.
  3. 모든 요소들이 0이면 답이 000으로 될 수 있으므로 조건문을 통해 0을 출력하도록 한다.

💡 Comparator란?
compare() 메서드를 사용해서 여러가지 특별 조건을 가진 정렬을 구하기 위한 인터페이스

💡 compareTo() 문자열 비교

  • 기준값에 비교대상이 포함되어 있을 경우, 서로의 문자열 길이의 차이값을 리턴(단, 같은 위치에 있어야 함.)
  • 비교 불가능한 지점의 문자열 아스키값을 기준으로 비교하여 차이값을 리턴
String str = "abcd";
str.compareTo("ab") // 4 - 2 = 2
str.compareTo("c") // 97 - 99 = -2
profile
초심 잃지 않기

0개의 댓글

관련 채용 정보