[Java] Softeer Level 2- "GPT식 숫자 비교" 자바 풀이
문제
얼마 전 GPT의 실수 비교 방식이 화제가 된 적이 있었다.
질문) "3.9와 3.11 중에 뭐가 더 커?" / 답변) "3.11이 더 큽니다."
수학 시간에 졸지 않은 사람들은 가 보다 크다고 생각하지만, GPT의 눈으로 보면 Python 3.9와 Python 3.11 중 후자를 더 크게 보는 학습 데이터가 많아 저렇게 생각할 수 있다. GPT의 세상에서 3.1은 3보다 크고, 마찬가지로 3.9는 3.2보다 크지만, 3.10은 3.2보다 큰 값으로 처리된다.
구체적으로, 소수점을 기준으로 왼쪽을 수로 읽은 값을 , 오른쪽을 수로 읽은 값을 라고 할 때 두 수의 비교가 다음과 같이 이루어진다:
- 값이 더 작으면 더 작은 수이다.
- 값이 같을 경우 값이 더 작으면 더 작은 수이다.
- 소수점이 없는 경우는 같은 수의 소수점이 있는 경우보다 항상 작게 취급된다. (다시 말해, GPT에게 3은 3.0보다 작다.)
개의 수들이 주어졌을 때, 이를 GPT의 기준에 따라 비내림차순으로 정렬해보자.
제약조건
[문제 제약 조건]
[조건 1] 은 이상 이하이다.
[조건 2] 각 수는 실수 혹은 정수로 표현되고, 이상 이하이며, 소수점이 없거나 소수점 아래 최대 3자리까지 주어진다.
[서브 태스크별 제약 조건]
별도의 서브 태스크가 존재하지 않습니다.
입력형식
첫 번째 줄에 이 주어진다.
두 번째 줄부터 개의 줄에 걸쳐, 각 수가 한 줄에 하나씩 주어진다.
01.23, 3.001과 같이 소수점을 기준으로 각 파트의 이 아닌 수 이전에 leading zero가 나오는 경우는 주어지지 않는다.
추가로, 3.00, 3.000, 또는 00.1과 같이 소수점을 기준으로 한 파트에 두 개 이상의 0만 주어지는 입력은 없다.
출력형식
첫 번째 줄부터 개의 줄에 걸쳐, 입력으로 주어진 수들을 GPT의 기준으로 비내림차순으로 정렬한 순서대로 한 줄에 하나씩 출력한다.
예제
5 1.2 1.11 2.9 4.2 3
1.2 1.11 2.9 3 4.2
1.2와 1.11의 순서에 유의해 출력하면 된다.
8 1 1.0 2.0 2.10 2.1 2.100 1.11 1.3
1 1.0 1.3 1.11 2.0 2.1 2.10 2.100
풀이
적절한 계산을 이용한 배열의 정렬 문제
소숫점을 기준으로 앞자리 정수와 뒷자리 정수를 비교한다.
자바의 배열에서의 sort함수의 시간복잡도는 O(nlogn)으로 입력값 N의 최댓값인 1,000이 들어와도 1초 안에 정렬 가능
코드
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));
StringBuilder sb = new StringBuilder();
ArrayList<String> arr = new ArrayList<>();
// 입력값 받기
int N = Integer.parseInt(br.readLine());
for(int i=0; i < N; i++){
arr.add(br.readLine());
}
// 람다함수로 정렬 정의
Collections.sort(arr, (first, second) -> {
String[] a1 = first.split("\\.");
String[] a2 = second.split("\\.");
// 앞자리 정수비교
int r1 = Integer.parseInt(a1[0]) - Integer.parseInt(a2[0]);
// 앞자리 정수가 같지 않다면, 결과 리턴하여 정렬
if(r1 != 0){
return r1;
}
// 뒷자리 정수비교
// 소숫점이 없는 값과 소숫점 이후 값이 0인 값을 비교하기 위해서 없다면, -1처리
int n1 = a1.length < 2 ? -1 : Integer.parseInt(a1[1]);
int n2 = a2.length < 2 ? -1 : Integer.parseInt(a2[1]);
return n1 - n2;
});
// 출력값 세팅
for(String item : arr) {
sb.append(item).append("\n");
}
System.out.println(sb.toString());
br.close();
}
}
'Programming > Algorithm' 카테고리의 다른 글
| [Java] 모듈러 제곱근 (0) | 2025.05.01 |
|---|---|
| [Java] 자바의 이진 연산(비트 연산) (0) | 2025.04.06 |
| [Kotlin] 백준 2504 괄호의 값 코틀린 풀이 - stack (1) | 2025.03.31 |
| [Kotlin] 백준 14888 - 연산자 끼워넣기(재귀완전탐색 DFS, 백트래킹) (1) | 2025.03.09 |
| [Kotlin] 백준 1978 소수 찾기 (1) | 2025.03.08 |