코딩문제
[소프티어] GPT식 숫자 비교
do_hyuk
2025. 1. 22. 16:55
https://softeer.ai/practice/11001
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
해당 문제는 정렬 문제로 쉽다고 생각할 수 있지만 특정 조건들 때문에 복잡하다고 느꼇고, 커스텀 정렬을 구현해야해서 시간이 걸렸다.
문제
일반적인 비내림차순 정렬일 경우 sort() 메서드 한 번이면 되겠지만 아래와 같은 조건들 때문에 커스텀 정렬을 구현함
[조건]
1. 소수점을 기준으로 x,y로 나누어 x1과 x2의 값이 같을 경우, y1과 y2의 크기로 정렬한다.
ex) 1.11 과 1.3 인 경우 1.11 > 1.3 이다.
2. 소수점이 없는 경우 x의 값이 같으면 소수점이 있는 수가 더 크다
ex) 1 과 1.0 인 경우 1 < 1.0 이다.
정렬 코드
// [커스텀 정렬 방식]
// 반환값이 양수면 두 숫자의 위치를 변경
// 반환값이 음수면 위치 변경 없음
result.sort((a, b) -> {
String[] aParts = a.split("\\.");
String[] bParts = b.split("\\.");
// 정수부분 길이 비교
int intComp = Integer.compare(aParts[0].length(), bParts[0].length());
if (intComp != 0) return intComp;
// 정수부분이 같은지 비교
intComp = aParts[0].compareTo(bParts[0]);
if (intComp != 0) return intComp;
// 두 숫자의 소수점 존재 여부
boolean aHasFraction = (aParts.length == 2);
boolean bHasFraction = (bParts.length == 2);
// 소수점 여부로 정렬
if(aHasFraction && !bHasFraction) return 1;
if(!aHasFraction && bHasFraction) return -1;
// 소수점이 있으면 Y값을, 그렇지 않다면 -1
int aFraction = aHasFraction ? Integer.parseInt(aParts[1]) : -1;
int bFraction = bHasFraction ? Integer.parseInt(bParts[1]) : -1;
// 소수점 부분 크기 비교
return Integer.compare(aFraction, bFraction);
});
이번에 거의 처음으로 삼항식과 compare 및 compareTo 메서드를 써보면서 편리함도 알았지만 가독성이 그리 좋지 않다는 것도 알았다. 다음에는 검색하는거 없이 직접 삼항식 및 Comparable 메서드 사용할 수 있도록 익숙해져야겠다.
전체 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
List<String> result = new ArrayList<>();
for (int n=0; n<N; n++) {
result.add(br.readLine());
}
result.sort((a, b) -> {
String[] aParts = a.split("\\.");
String[] bParts = b.split("\\.");
int intComp = Integer.compare(aParts[0].length(), bParts[0].length());
if (intComp != 0) return intComp;
intComp = aParts[0].compareTo(bParts[0]);
if (intComp != 0) return intComp;
boolean aHasFraction = (aParts.length == 2);
boolean bHasFraction = (bParts.length == 2);
if(aHasFraction && !bHasFraction) return 1;
if(!aHasFraction && bHasFraction) return -1;
int aFraction = aHasFraction ? Integer.parseInt(aParts[1]) : -1;
int bFraction = bHasFraction ? Integer.parseInt(bParts[1]) : -1;
return Integer.compare(aFraction, bFraction);
});
for(String num : result){
bw.write(num);
bw.newLine();
}
bw.flush();
bw.close();
}
}