링크 : 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;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 조이스틱(Java) (0) | 2025.03.06 |
|---|---|
| [프로그래머스] H-Index(Java) (0) | 2025.02.27 |
| [프로그래머스] 전력망을 둘로 나누기(Java) (0) | 2025.02.25 |
| [프로그래머스] 소수 찾기(Java) (0) | 2025.02.24 |
| 프로그래머스 코딩테스트 고득점 Kit : 해시(Java) (1) | 2025.02.19 |