
이 문제는 정렬을 이용한 문제다.
처음에 생각했던 건 String 배열을 선언한 후 한 줄을 통째로 인덱스 하나에 넣고,
인덱스 하나하나 크기를 비교할 때
공백을 기준으로 앞 숫자를 먼저 비교한 후, 뒤 숫자를 비교하려 했다.
그렇게 하기 전, 우선 단순하게 Arrays.sort로 문자열 자체를 비교해보았다.
5
3 4
1 1
1 -1
2 2
3 3
다음과 같이 예제의 input을 넣으면
1 -1
1 1
2 2
3 3
3 4
이렇게 output이 정상적으로 나온 것 처럼 보이지만
일반 sort를 사용하면 한 글자씩만 비교하기 때문에
10 1과 9 1 을 비교하면 9 1 이 더 크다고 해버리기 때문에 비교가 성립이 되지 않는다.
(1과 9만을 비교해서 9 1 이 더 크다고 판단한 것이다.)
문제를 어떻게 풀지 다시 생각해보다가 다른분의 예제를 보고 힌트를 얻었다.
객체로 만들어서 비교하는것.
자바 [JAVA] - Comparable 과 Comparator의 이해
정렬을 할 때 comparable의 메소드를 override하면 정렬의 기준을 만들어 줄 수 있다는 힌트다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.reflect.Constructor;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static class Sort implements Comparable<Sort> {
int n1;
int n2;
Sort(int n1, int n2){
this.n1 = n1;
this.n2 = n2;
}
@Override
public int compareTo(Sort o) {
if(this.n1 < o.n1){
return -1;
} else if(this.n1 > o.n1){
return 1;
} else {
return this.n2 - o.n2;
}
} // 이 메소드가 정렬의 기준을 만듦
}
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
String[] str = new String[n];
Sort[] s = new Sort[n];
for(int i = 0 ; i < n ; i++){
str[i] = scan.nextLine();
int n1 = Integer.parseInt(str[i].split(" ")[0]);
int n2 = Integer.parseInt(str[i].split(" ")[1]);
s[i] = new Sort(n1, n2);
}
Arrays.sort(s);
for(int i = 0 ; i < n ; i++){
System.out.println(s[i].str1+" "+s[i].str2);
}
}
}
중점적으로 봐야하는 코드는 Sort클래스의 compareTo 메소드
sort라는 클래스를 만들어주고 comparable을 상속받는다.
공백을 기준으로 앞 글자를 서로 비교하여 리턴해주고, 만약 앞 글자가 같다면 뒤 글자를 비교해주는 것이다.
처음에 입력받는 테스트케이스의 수 만큼의 크기로 sort클래스 객체가 들어갈 수 있는 배열을 생성해 주고,
인덱스 하나하나마다 클래스를 선언한다.
그렇게 되면
s[Sort(str1, str2), Sort(str1, str2), Sort(str1, str2), Sort(str1, str2), Sort(str1, str2)] 이렇게 sort클래스가 인덱스에 하나하나 들어가게 되고,
Arrays.sort(s)를 하게되면 정렬의 기준이 내가 원하는 기준으로 잡혀있기 때문에
Sort객체를 비교를 하게된다.
예를 들어 10 1 , 10 2가 input이 되었다면
10 1을 공백을 기준으로 나눠서 각각 n1, n2에 들어가고
sort클래스에 들어간다.
10 2도 마찬가지
그러면 Sort(10, 1)과 Sort(10, 2)를 비교하게 되는 것이다.
compareTo 메소드를 보면
this.n1 과 o.n1을 비교한다.
여기서 thiss.n1은 자기 자신의 n1이고, o.n1은 비교대상의 n1이다.
둘다 10으로 같으므로 뒤의 숫자를 비교하게 하여 return this.n2 - o.n2을 해줬다.
비교대상인 o.n2가 더 크므로 음수를 return하게 되고, 이것을 기준으로 Arrays.sort에서
정렬을 하게 되는 것이다.