Lv.2
얼마 전 GPT의 실수 비교 방식이 화제가 된 적이 있었다.
질문) "3.9와 3.11 중에 뭐가 더 커?" / 답변) "3.11이 더 큽니다."
수학 시간에 졸지 않은 사람들은 3.9가 3.11보다 크다고 생각하지만, GPT의 눈으로 보면 Python 3.9와 Python 3.11 중 후자를 더 크게 보는 학습 데이터가 많아 저렇게 생각할 수 있다. GPT의 세상에서 3.1은 3보다 크고, 마찬가지로 3.9는 3.2보다 크지만, 3.10은 3.2보다 큰 값으로 처리된다.
구체적으로, 소수점을 기준으로 왼쪽을 수로 읽은 값을 x, 오른쪽을 수로 읽은 값을 y라고 할 때 두 수의 비교가 다음과 같이 이루어진다:
x값이 더 작으면 더 작은 수이다.
x값이 같을 경우 y값이 더 작으면 더 작은 수이다.
소수점이 없는 경우는 같은 수의 소수점이 있는 경우보다 항상 작게 취급된다. (다시 말해, GPT에게 3은 3.0보다 작다.)
N개의 수들이 주어졌을 때, 이를 GPT의 기준에 따라 비내림차순으로 정렬해보자.
N은 1 이상 1,000 이하이다.
각 수는 실수 혹은 정수로 표현되고, 0 이상 100 이하이며, 소수점이 없거나 소수점 아래 최대 3자리까지 주어진다.
별도의 서브 태스크가 존재하지 않습니다.
첫 번째 줄에 N이 주어진다.
두 번째 줄부터 N개의 줄에 걸쳐, 각 수가 한 줄에 하나씩 주어진다.
01.23, 3.001과 같이 소수점을 기준으로 각 파트의 0이 아닌 수 이전에 leading zero가 나오는 경우는 주어지지 않는다.
추가로, 3.00, 3.000, 또는 00.1과 같이 소수점을 기준으로 한 파트에 두 개 이상의 0만 주어지는 입력은 없다.
첫 번째 줄부터 N개의 줄에 걸쳐, 입력으로 주어진 수들을 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
2.1, 2.10, 2.100은 실제 수 체계에서는 모두 같은 값이지만, GPT의 기준으로는 다르다는 점에 유의해야 한다.
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
String[] arr = new String[len];
for(int i=0; i<len; i++){
arr[i] = sc.next();
}
for(int i=0; i<len; i++) {
for(int j=i+1; j<len; j++){
if(compare(arr[i],arr[j])){
String tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
for(String a: arr){
System.out.println(a);
}
}
public static boolean compare(String i, String j) {
String[] x = i.split("\\.");
String[] y = j.split("\\.");
if(Integer.parseInt(x[0]) > Integer.parseInt(y[0])){ // 첫번째가 두번째보다 크면 자리를 바꾼다
return true;
} else if(Integer.parseInt(x[0]) == Integer.parseInt(y[0])) { //정수가 동일한 경우
if(x.length == 2 && y.length == 1){ //소숫점 자리수가 없는 경우
return true;
} else if((x.length == 2 && y.length == 2 )
&& Integer.parseInt(x[1]) > Integer.parseInt(y[1])){
return true;
}
}
return false;
}
}
너무 길게 푼 코드여서 간결하게 풀이하는 법 연구가 필요하다