문제 풀이/소프티어
[소프티어] GPT식 숫자 비교(JAVA)
27200
2025. 2. 13. 22:40
문제
https://softeer.ai/practice/11001
풀이(30분)
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));
int n = Integer.parseInt(br.readLine());
PriorityQueue<String> pq = new PriorityQueue<>((o1, o2) -> {
double num1 = Double.parseDouble(o1);
double num2 = Double.parseDouble(o2);;
boolean num1IsDouble = o1.contains(".");
boolean num2IsDouble = o2.contains(".");
if(num1IsDouble && num2IsDouble){ // 둘 다 실수인 경우
int num1Left = Integer.parseInt(o1.split("\\.")[0]);
int num1Right = Integer.parseInt(o1.split("\\.")[1]);
int num2Left = Integer.parseInt(o2.split("\\.")[0]);
int num2Right = Integer.parseInt(o2.split("\\.")[1]);
if(num1Left != num2Left){ // 앞자리가 다르다면
return num1Left - num2Left; // 앞자리만 비교하여 정렬
}
return num1Right - num2Right; // 앞자리가 같다면 소수점 자리 비교
}
if(num1IsDouble || num2IsDouble){ // 둘 중 하나만 정수인 경우
if(num1 == num2){ // 앞자리가 같다면
if(num1IsDouble){ // 둘 중 실수인 것을 뒤로
return 1;
}
return -1;
}
}
return Double.compare(num1, num2); // 아니면 그냥 오름차순
});
for (int i = 0; i < n; i++) {
pq.add(br.readLine());
}
for(int i = 0; i < n; i++){
System.out.println(pq.poll());
}
}
}
소프티어는 풀어본 적이 없이 소프티어 부트캠프 코딩테스트만 보고 처음 풀어보는 것이다.
문제 형식 자체는 백준과 동일하다고 생각된다.
풀이는 단순하다.
우선순위 큐의 정렬 방식을 직접 설정해주었다.
우선 소수점을 기준으로 좌우를 구분해야 하기에 문자열 자료형인 String으로 받아온다.
소수점을 기준으로 구분하고, 실수인 경우와 정수인 경우를 나누어 계산한다.
1. 둘 다 실수라면
1-1. 앞자리를 먼저 비교한다.
1-2. 앞자리가 다르다면 큰 수를 뒤로 해준다.
1-3. 앞자리가 같다면 오른쪽(소수점의 수)을 비교하여 정렬한다.
2. 둘 중 하나만 실수라면
2-1. 앞자리가 같다면 실수인 것을 뒤로해준다.
2-2. 앞자리가 다르다면 큰 수를 뒤로 해준다.
3. 둘 다 정수라면
3-1. 정렬해 준다.