[백준-자바] N_11650 좌표 정렬하기

0woy·2022년 12월 22일
0

코딩테스트

목록 보기
1/40

📜 문제

2차원 배열을 이용해 좌표를 정렬하는 문제이다.
x좌표를 기준으로 오름차순으로 정렬하되 x좌표가 같다면 y좌표를 기준으로 오름차순으로 정렬한다.

오랜만에 Java를 사용했더니 고민하는 시간이 생각보다 길었다.


✍ 부분 코드 설명

// 라이브러리 import
import java.io.*;
import java.util.*;

 public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] point = new int[n][2];
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            point[i][0] = Integer.parseInt(st.nextToken());
            point[i][1] = Integer.parseInt(st.nextToken());
        }

BufferReader를 사용하여 입력을 받도록 한다.
2차원 배열인 point를 선언해 주고 점의 개수인 N만큼 배열을 할당한다.

StringTokenizer를 사용해 한 줄을 받아와 공백을 기준으로 구분한다.
point[i][0]과 point[i][1]에 받아온 값을 저장한다.


정렬을 하는 핵심 코드!
2차원 배열을 Arrays.sort(point) 처럼 사용하게 되면 컴파일에러가 발생하므로 sort의 compare함수를 오버라이딩하여 사용하였다.

Arrays.sort(point, new Comparator<int[]>() {
	@Override
    public int compare(int[] o1, int[] o2) {
		return o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1];
	}
});

위 코드가 요상하게 생겼다고 겁먹을 필요없다.
사실 필자는 처음엔 겁먹었지만 코드 설명 부분을 읽고나니 용감해졌다.
compare의 설명 부분을 보도록 하자.

public int compare ... 마우스를 올리면 위와 같이 설명이 나온다.
주목할 곳은 노란색 형광펜이 칠해진 Returns 부분이다.

compare 함수는 o1이 o2보다 작으면 음수, 같으면 0, 크면 양수를 반환한다.
c언어의 strcmp와 같은 역할을 한다.

Arrays.sort(point, new Comparator<int[]>() {
	@Override
    public int compare(int[] o1, int[] o2) {
		return o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1];
	}
});

즉 위 코드는 x좌표가 같지 않다면 o1의 x좌표에서 o2의 x좌표를 뺀 값을,
x좌표가 같다면 o1의 y좌표에서 o2의 y좌표를 뺀 값을 반환한다는 의미가 된다.
그리고 반환 값에 따라서 정렬을 수행한다.


정렬된 point 배열을 출력한다.

System.out.println();
for (int i = 0; i < n; i++) {
	System.out.println(point[i][0] + " " + point[i][1]);
}


🍳 전체 소스코드

import java.io.*;
import java.util.*;

public class N_11650 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] point = new int[n][2];
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            point[i][0] = Integer.parseInt(st.nextToken());
            point[i][1] = Integer.parseInt(st.nextToken());
        }

        // 2차원 배열 정렬 다중조건
        Arrays.sort(point, new Comparator<int[]>() {
            @Override
            // 첫번째 숫자 기준 오름차순 후 같다면 두번째 숫자 기준 오름차순
            public int compare(int[] o1, int[] o2) {
                return o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1];
            }
        });
        
        System.out.println();
        for (int i = 0; i < n; i++) {
            System.out.println(point[i][0] + " " + point[i][1]);
        }
    }
}

✨ 결과

0개의 댓글