코딩 테스트/프로그래머스

프로그래머스 가장 큰 수 Java 풀이

K1MY0UNGHAN 2020. 4. 17. 21:57

기존 풀이

import java.util.*;

public class Solution {
    public String solution(int[] numbers) {
        String answer = "";

        String[] strNumbers = new String[numbers.length];

        for (int i = 0 ; i < strNumbers.length ; i++) {
            strNumbers[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(strNumbers, Collections.reverseOrder());

        for (String strNumber : strNumbers) {
            answer += strNumber;
        }

        return answer;
    }
}

극히 일부의 테스트 케이스만 통과한 풀이이다.

sort하는 부분에서 "30", "3"을 정렬할 때 단순히 String에 따라 정렬하게 되면 "30", "3"으로 정렬되어

새로운 정렬 기준을 구현하는 Comparator 또는 Comparable을 구현해야 할 거 같았는데 잘 떠오르지 않았다.

 

https://developerdk.tistory.com/24

 

[프로그래머스/코딩테스트 고득점 Kit/정렬#2] 가장 큰 수 (Java)

프로그래머스 (programmers) 코딩테스트 고득점 Kit 정렬 (Sort) #2 가장 큰 수 (Java) 1. 문제 설명 문제: https://programmers.co.kr/learn/courses/30/lessons/42746 0 또는 양의 정수가 주어졌을 때, 정수를..

blog.animalface.site

이 분의 풀이를 참고한 풀이는 다음과 같다.

import java.util.*;

public class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();

        String[] strNumbers = new String[numbers.length];

        for (int i = 0 ; i < strNumbers.length ; i++) {
            strNumbers[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(strNumbers, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s2+s1).compareTo(s1+s2);
            }
        });

        if (strNumbers[0].equals("0")) return "0";

        for (String strNumber : strNumbers) {
            answer.append(strNumber);
        }

        return answer.toString();
    }
}

String의 합을 비교하여 Comparator를 구현했을 뿐만 아니라 numbers 배열이 0을 포함했을 때도 고려한 좋은 풀이다.

 

다른 사람의 풀이

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";

        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < numbers.length; i++) {
            list.add(numbers[i]);
        }
        Collections.sort(list, (a, b) -> {
            String as = String.valueOf(a), bs = String.valueOf(b);
            return -Integer.compare(Integer.parseInt(as + bs), Integer.parseInt(bs + as));
        });
        StringBuilder sb = new StringBuilder();
        for(Integer i : list) {
            sb.append(i);
        }
        answer = sb.toString();
        if(answer.charAt(0) == '0') {
            return "0";
        }else {
            return answer;
        }
    }
}