본문 바로가기
알고리즘/프로그래머스

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

by hxxyeoniii 2025. 2. 26.

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42746#qna

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 풀이

제일 먼저 문제를 보고 각 자릿수 별로 비교하는 Compartor를 구현해야 한다고 생각했다.
만약 자릿수가 다르다면, str1 + str2과 str2 + str1 의 값을 비교해준다.
예를 들어, 3과 30일 경우 330과 303을 비교해 330이 더 크므로 3을 30보다 앞에 배치시킨다.

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        Integer[] newNumbers = Arrays.stream(numbers).boxed().toArray(Integer[]::new);

		Arrays.sort(newNumbers, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				String str1 = o1.toString();
				String str2 = o2.toString();

				int minLength = Math.min(str1.length(), str2.length());

				for(int i=0; i<minLength; i++) {
					if(str1.charAt(i) != str2.charAt(i)) {
						return str2.charAt(i) - str1.charAt(i);
					}
				}
						
				if(Integer.parseInt(str1 + str2) > Integer.parseInt(str2 + str1)) {
					return -1;
				}
				
                        	return 0;
			}
		});


	for(Integer num : newNumbers) {
		answer += num;
	}
        
        return answer;
    }
}

 
 
 
하지만 위의 코드 결과는 53.3점..

 
 
 
첫 번째 원인 : Comparator의 대칭성 문제

if(Integer.parseInt(str1 + str2) > Integer.parseInt(str2 + str1)) {
    return -1;
}

-> 위 코드에서 음수 뿐 아니라 반대의 경우 양수를 반환하게끔 대칭을 맞춰줘야 함
 
수정된 코드

if(Integer.parseInt(str1 + str2) > Integer.parseInt(str2 + str1)) {
    return -1;
} else if(Integer.parseInt(str1 + str2) < Integer.parseInt(str2 + str1)) {
    return 1;
} else {
    return 0;
}

 
 
두 번째 원인 : answer이 모두 0으로 이루어져 있을 경우를 고려해야 함 -> 테스트케이스 11번
answer가 "0000", "00" 등일 경우 0을 반환해주도록 코드 추가

if(answer.matches("0*")) {
    answer = "0";
}

 
 
 
최종 코드는 아래와 같다.

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        Integer[] newNumbers = Arrays.stream(numbers).boxed().toArray(Integer[]::new);

		Arrays.sort(newNumbers, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				String str1 = o1.toString();
				String str2 = o2.toString();

				int minLength = Math.min(str1.length(), str2.length());

				for(int i=0; i<minLength; i++) {
					if(str1.charAt(i) != str2.charAt(i)) {
						return str2.charAt(i) - str1.charAt(i);
					}
				}
						
				if(Integer.parseInt(str1 + str2) > Integer.parseInt(str2 + str1)) {
					return -1;
				} else if(Integer.parseInt(str1 + str2) < Integer.parseInt(str2 + str1)) {
                            		return 1;
                        	} else {
                           		return 0;
                       		}
			}
		});


	for(Integer num : newNumbers) {
		answer += num;
	}
        
        if(answer.matches("0*")) {
            answer = "0";
        }
        
        return answer;
    }
}