알고리즘/프로그래머스

[프로그래머스]JAVA - Level2. 가장 큰 수

K.두부 2022. 9. 1. 00:55
반응형

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

 

프로그래머스

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

programmers.co.kr

풀이

이번 문제도 풀이를 봤다.. 내 알고리즘 실력은 언제쯤 성장할 것인가..

 

우선 int 형의 numbers 변수를 String 형태로 변환해야하는 것은 알고 있었다. 하지만 아무리 생각해도 어떤식으로 숫자를 비교하면서 정렬해야하는지 감이 잡히지 않았다.

 

다른 분들의 풀이를 봤더니 Comparator 클래스를 이용해서 첫 번째 인자와 두 번째 인자를 비교해서 문제를 해결했다. 1번 예제의 경우 6, 10, 2가 있을 때 인접한 인자 두 개를 가져와서 순서를 바꾼 후 덧셈을 비교한다. 6+10 = 610 과 10+6 = 106을 비교해서 자리를 바꾸거나 그대로 둔다.

 

이렇게 하는 이유는 2번 예제에서 나온다. [9, 5, 34, 30, 3] 에서 30과 3을 비교해보면 3보다 30이 더 크기 때문에 330이 아닌 303으로 정렬된다. 그렇기 때문에 n1+n2 와 n2+n1을 비교 후에 내림차순으로 정렬해주어야한다.

 

또한 numbers의 원소가 0으로만 이루어졌을 경우를 대비해서 내림차순 정렬을 완료했을 때 맨 앞의 인자가 0이면 return 0을 해준다.

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        String[] strNum = new String[numbers.length];
        
        // 문자열로 변환
        for (int i=0; i<numbers.length; i++) {
            strNum[i] = String.valueOf(numbers[i]);
        }
        
        // 정렬 (내림차순)
        Arrays.sort(strNum, new Comparator<String>() {
            
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2);
            }
        });
        
        // 0이 맨 앞에 나오면 return 0
        if (strNum[0].equals("0")) {
            return "0";
        } else {
            for (String str : strNum) {
                answer += str;
            }
        }
        return answer;
    }
}

 

반응형