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

업데이트:


문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


제한사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.



입출력 예

numbers return
[6, 10, 2] “6210”
[3, 30, 34, 5, 9] “9534330”


JAVA 풀이 과정

// 틀린코드

import java.util.Arrays;
class Solution {
    public String solution(int[] numbers) {
        StringBuffer answer = new StringBuffer();
        
        String[] numStr = new String[numbers.length];
        for(int i = 0; i < numbers.length; i++){
            numStr[i] = String.valueOf(numbers[i]);
        }
        
        boolean flag = true;
        for(String s : numStr){
            if(!s.equals("0")) flag = false;
        }
        if(flag) return "0";
        
        
        Arrays.sort(numStr);

        for(int i = 1; i < numStr.length; i++){
            if(numStr[i].length() >= 2){
                if(numStr[i].charAt(0) == numStr[i-1].charAt(0))
                {   
                    String max = numStr[i] + numStr[i-1];
                    String max2 = numStr[i-1] + numStr[i];
                    if(Integer.parseInt(max) < Integer.parseInt(max2)) {
                        String temp = numStr[i-1];
                        numStr[i-1] = numStr[i];
                        numStr[i] = temp;
                    }
                    
                 }
            }
                
        }
        
        for(int i = numStr.length-1; i >= 0; i--){
            answer.append(numStr[i]);
        }
        
        return answer.toString();
    }
}

결과

프로그래머스에서 기본적으로 제공해주는 테스트케이스를 모두 통과했는데 제출하면 저렇게 테스트 케이스 1~6이 실패로 뜬다. 그래도 맨 처음 제출했을 땐 고작 하나만 통과해서 9.1이란 웃긴 점수를 받았는데 몇 개씩 고치다보니 7~11까지는 통과가 되었다..^^ 시간상 답을 봤다.

// 정답코드
import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        StringBuffer answer = new StringBuffer();
        
        String[] str =new String[numbers.length];
        
        for(int i = 0; i < numbers.length; i++){
            str[i] = String.valueOf(numbers[i]);
        }
        
        // 내림차순 정렬
        Arrays.sort(str, new Comparator<String>(){
            @Override
            public int compare(String a, String b){
                return (b+a).compareTo(a+b);
            }
        });
        
        if(str[0].equals("0")) return "0";
        
        for(String s : str) answer.append(s);
        
        return answer.toString();
    }
}


CompareTo() 함수는 저번에 한 번 정리했었는데 그 이후로 사용해본 적이 없어 이번에 활용하지 못했다. 역시 여러 번 써봐야 손에 익는 것 같다. a.compareTo(b)는 앞에서부터 비교하다가 다른 문자열이 나오면 ‘a-b’ 순서로 해당 문자의 아스키코드 값을 뺀 결과(int)를 리턴한다. 위 메소드에서 a, b 순서로 있을 때 (b+a).compareTo(a+b)를 했을 경우 ‘b+a’가 더 크면 자리를 바꿔준다.



다른 사람의 풀이

// 김형민 , - , - , 승환 , - 외 11 명
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;
        }
    }
}

Arrays.sort() 대신 Collections.sort()를 사용하였으며 람다식을 사용한 코드이다.

댓글남기기