본문 바로가기
Algorithm/프로그래머스 고득점 Kit

[정렬] 가장 큰 수 - Java 풀이

 

 

프로그래머스

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

programmers.co.kr

 

 

문제

 

접근법

Comparator를 어떻게 잘 사용해야  값들을 서로 잘 비교하면서 정렬해줄수 있을까 고민하였다.

이 문제는 주어진 배열의 숫자를 문자열로 형변환후 서로 값들을 붙여서 비교후

내림차순 정렬하여 그 값들을 모두 붙여 문자열을 반환하는 문제이다.

 

방법

1. 서로의 값을 붙여 비교하기 위해 반드시 int array -> String Array 형변환 

2. Comparator 를 이용해 정렬방식 재정의

+  마지막 반환시, 0,0,0,0... 과 같이 0 값들로만 들어 왔을 때, 0으로 반환  (TestCase 11 해당)

 

풀이

1. 

import java.util.Arrays;
import java.util.Comparator;
public class Solution {
    public String solution(int[] numbers){
        StringBuffer sb = new StringBuffer();  // 결과를 문자열로 붙이는 경우 String보다 Sb가 성능이 더 좋습니다.

        String[] str = new String[numbers.length];  // 비교를 위해 Input 배열을 String으로 변환
        for(int i=0;i<numbers.length; i++)
            str[i] = Integer.toString(numbers[i]);

        // 핵심부분 - Comparator인터페이스를 이용해 정렬 재정의
        Arrays.sort(str, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return -(o1+o2).compareTo(o2+o1);  // compareTo 문자열의 아스키코드를 비교해가면서 큰수면 양수, 작은수면 음수반환
                // 내림차순을 위해서 -로 값 반전 (비교시 o2+o1 먼저 비교하는 형식으로도 내림차순 정렬가능)
            }
        });

        //  0으로만 이루어진 값의 경우 0000으로 반환하지않고, 0으로 반환하도록 한다. (이런부분은 코테에서 핵심이 아니므로 무시해도될듯)
        if(str[0].equals("0"))
            return "0";
        else {
            for(String s : str) {
                //System.out.println(s);
                sb.append(s);
            }
        }
        return sb.toString();
    }
}
// Integer tmp[] = Arrays.stream(numbers).boxed().toArray(Integer[]::new); // int -> integer 변환

21.07.24 풀이이며 상대적으로 코드가 길고

코드가 기본적인 분법을 토대로 작성되어있다.

 

 

 

2. Lambda 이용

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

class Solution {
    public static String solution(int[] numbers) {
        String tmp[] = Arrays.toString(numbers).replaceAll("[^0-9 ]", "").split(" ");
        Arrays.sort(tmp, (o1, o2) -> (o2.concat(o1)).compareTo(o1.concat(o2)));
        String res = Arrays.toString(tmp).replaceAll("[^0-9]","");
        if(res.startsWith("0")) return "0";
        return res;
    }
}

 

 

22.02.27 오늘 다시 푼 코드이다.

Arrays.toString 메서드 하나로  많은 코드를 줄였다.