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

문제 설명

  • 배열로 들어온 숫자들의 순서를 바꿔서 가장 큰 수를 만드는 문제이다.

풀이 과정

  • 정렬을 통해 풀이에 접근하는데, 어떻게 정렬할지에 대해 고민을 좀 오래해서 그에 대한 설명을 적어두려 한다.
  • 예시 테스트 케이스처럼 [6,10,2] 가 input으로 들어오는 경우, 6,2,10으로 정렬을 해야 우리가 원하는 답을 구할 수 있다.
  • int 자료형으로 들어오기 때문에, 단순히 크기로는 비교를 할 수 없었다.
  • 또한 문자열로 배열을 변경 후에 자릿수를 일일이 비교하기에도 꽤 복잡했다 (자리수 일일이 비교)
  • 이 부분에서 조금 오래 고민했는데 명쾌한 방법이 떠올랐다.
  • 10과 2를 비교할 때 우리가 원하는 순서는 2,10 이다.
  • 그러면 문자열로 배열의 원소를 변경했으므로, “10”+”2” 와 “2”+”10”을 비교해서 더 큰 값을 앞에 오도록 정렬을 시키면 모든 조건이 만족하며 해결이 되었다.
  • 즉, “10”+”2” = “102” 이고, “2”+”10” = “210” 이므로, 문제에서 원하는 조건에 맞게 딱 정렬을 시킬 수 있게 된다!
  • 이 방법이 떠오르고 나니 금새 문제를 해결할 수 있었다.
import java.util.*;

public class LEV2_가장큰수 {
    public String solution(int[] numbers) {
        String[] numbersToString = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            numbersToString[i] = String.valueOf(numbers[i]);
        }
        Arrays.sort(numbersToString, (o1, o2) -> -(o1 + o2).compareTo(o2 + o1));
        StringBuilder output = new StringBuilder();
        boolean flag = false;
        for (String s : numbersToString) {
            for (char c : s.toCharArray()) {
                if (c != '0') {
                    flag = true;
                    break;
                }
            }
            output.append(s);
        }
        return flag ? output.toString() : "0";
    }
}

댓글남기기