본문 바로가기

SQL/프로그래머스

[프로그래머스/JAVA] 가장 큰 수 - Comparator

문제

 

 

풀이

이게 어떻게 Comparator로 풀릴까 참 고민이 많았던 문제....

옆의 숫자와 비교해 (str1+str2)와 (str2+str1) 중 큰 숫자, 즉 내림차순으로 정렬만 해주면 끝나는 문제

내부 로직은 어떤 순서로 진행되는지, 어떤 알고리즘이 쓰이는지 알 수 없지만 참말루 참신하다잉

 

 

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        String[] strArr = new String[numbers.length];
        for(int i=0; i<numbers.length; i++){
            strArr[i] = Integer.toString(numbers[i]);
        }
        Arrays.sort(strArr, (o1, o2) -> (o2+o1).compareTo(o1+o2));
        answer = String.join("", strArr);
        if(answer.charAt(0)=='0') return "0";
        return answer;
    }
}

 

 

 

짱 멋있는 보석쓰 코드도 루팡해옴...

이런 사람이랑 이제 코테 경쟁을 해야 된다니 넘모 무서워 살살해줘. 아니 내가 이길 때까지 한다.

 

 

"numbers의 원소는 0 이상 1,000 이하입니다."라는 조건을 보고

배열안의 각 숫자를 자기자신 포함 3번 반복되게 붙여준다 ex) 3 -> 333, 34 -> 343434

그 후, 앞자리 3개만 비교해 내림차순으로 정렬해준 뒤, 모두 붙여서 출력하면 끝.

import java.util.*;
class Solution {
    static class Node{
        int idx;
        String value;
        public Node(int idx, String value) {
            this.idx = idx;
            this.value = value;
        }
        public String getValue() {
            return value;
        }
        public int getIdx() {
            return idx;
        }
    }
    public String solution(int[] numbers) {
        ArrayList<Node> arrayList = new ArrayList<>();
        int idx = 0;
        for (int x : numbers) {
            arrayList.add(new Node(idx, String.valueOf(x) +String.valueOf(x) +String.valueOf(x)));
            idx ++;
        }
        arrayList.sort(Comparator.comparing(Node::getValue)
                .thenComparing(Node::getIdx)
                .reversed());
        String res = "";
        for (Node n : arrayList) {
            if (!res.equals("0")) {
                res += Integer.parseInt(String.valueOf(numbers[n.idx]));
            }
        }
        return res;
    }
}