알고리즘 문제 풀기

[프로그래머스 42746] 가장 큰 수 (java)

Solu- 2021. 4. 30. 16:33

링크

나의 코드

import java.util.ArrayList;

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

        // 앞자리가 큰 수 일수록 우선 처리
        ArrayList<Integer> ans = new ArrayList<>();

        for (int i : numbers) {
            ans.add(i);
        }

        // sort를 통해 정렬
        ans.sort((o1, o2) -> {
            if (o1 == o2) {
                // 둘이 같으면 0 반환
                return 0;
            }

            // 문자열 만들기
            String o12 = o1.toString() + o2.toString();
            String o21 = o2.toString() + o1.toString();

            // 값 비교
            if (Integer.parseInt(o12) > Integer.parseInt(o21)) {
                return -1;
            }
            else {
                return 1;
            }
        });

        // 모든 원소가 0인지 확인하는 변수
        boolean flag = true;

        for (int i : ans) {
            if (i != 0) {
                // 0이 하나라도 오면, 정상 처리
                flag = false;
            }
            answer += Integer.toString(i);
        }

        if (flag) {
            // 전부 0이면
            answer = "0";   // 더했던 문자열 다 스킵.
        }


        return answer;
    }
}

ArrayList.sort() 함수를 이용해서 정렬하고자 했다. sort의 정렬 규칙은 사용자가 만들어 넣을 수 있기 때문에, 적혀있는 규칙대로 어느 수가 더 큰지 비교하여 반환했다.

여기서 주의할 점은, int[] numbers = {0, 0, 0, 0}일 때의 답이 0000이 아니고 0이라는 점이다. 이 부분 처리를 위해 flag 변수를 사용했다.

내가 잘못짠 것인지는 몰라도, 확실히 처리 속도가 느렸다.

모범 답안

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;
        }
    }
}

생각했던 로직을 깔끔하게 정리해서 넣은 코드이다. 먼저 list에 넣고 저장하는 게 아니라, Collections.sort()에서 정리하면서 원소를 넣었고, 정리 함수 내에서도 값의 비교를 Integer.compare를 통해 처리하여 코드가 더욱 깔끔해졌다.

모든 원소가 0인지 확인하는 과정에서도, 결국 가장 큰 자리의 값이 0이라면, 모든 원소가 0이라는 이야기이다. 때문에 마지막 원소만 0인지를 판별하여 반환했다.

더욱 더 정리된 모습으로 표현할 수 있도록 노력해야겠다.