[JAVA] 백준 11650: 좌표 정렬하기 해결과정

thwang26·2023년 3월 11일


이 문제는 정렬을 이용한 문제다.
처음에 생각했던 건 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에서
정렬을 하게 되는 것이다.

profile
💻디버깅중

0개의 댓글