home > algorithm > baekjoon > [baekjoon] 좌표 정렬하기 2 (백준 11651 java 풀이)

[baekjoon] 좌표 정렬하기 2 (백준 11651 java 풀이)
algorithm baekjoon step13

intro : 좌표 정렬하기 문제 방금풀었는데, 그 문제랑 다른건 x,y 정렬 기준 뿐이다.

백준 문제링크

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

문제 풀이 (596ms)

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        // 입출력을 위한 BufferedReader, BufferedWriter, StringBuilder 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        // 입력값의 개수
        int forCount = Integer.parseInt(br.readLine());
        // 좌표값을 저장할 2차원 배열 선언
        int[][] array = new int[forCount][2];
        // 빈복문을 통해 2차원 배열에 데이터 저장
        for (int i = 0; i < forCount; i++) {
            // 입력값을 공백 기준으로 데이터를 자르기 위한 StringTokenizer 객체 생성
            StringTokenizer st = new StringTokenizer(br.readLine());
            array[i][0] = Integer.parseInt(st.nextToken());
            array[i][1] = Integer.parseInt(st.nextToken());
        }
        // 배열 정렬
        Arrays.sort(array, (o1, o2) -> {
            // y값이 다르다면 y값을 기준으로 오름차순 정렬
            if (o1[1] != o2[1]) {
                return o1[1] - o2[1];
            } else {
                // y값이 같다면 x값을 기준으로 오름차순 정렬
                return o1[0] - o2[0];
            }
        });

        // 정렬된 2차원 배열 데이터 sb.append() 메서드를 통해 저장
        for (int[] arr : array) {
            sb.append(arr[0])
                    .append(" ")
                    .append(arr[1])
                    .append("\n");
        }

        // bw로 출력하기 위해 문자열로 변환 후 write
        bw.write(sb.toString());
        bw.flush();
        // 자원 반납
        bw.close();
        br.close();
    }
}

문제 해석

이 문제는 좌표 정렬하기 문제와 정렬기준이 반대인거 말고는 차이가 1도 없다. 정렬기준이 반대라는 점은 이전 좌표정렬하기 문제에서는 x값 기준으로 먼저 정렬하고 x값이 같다면 y값을 기준으로 오름차순 정렬을 하였는데, 이번 문제는 y값 기준으로 먼저 정렬하고 y값이 같다면 x값 기준으로 오름차순 정렬을 하는것으로 차이가 있다.

중요로직 (정렬)

아래로직은 2차원 배열을 y값을 기준으로 오름차순 정렬하고, y값이 같다면 x값을 기준으로 정렬하는 코드이다. 아래 코드가 이 문제를 푸는 키 포인트 이다.

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        ...
        ...

        // 배열 정렬
        Arrays.sort(array, (o1, o2) -> {
            // y값이 다르다면 y값을 기준으로 오름차순 정렬
            if (o1[1] != o2[1]) {
                return o1[1] - o2[1];
            } else {
                // y값이 같다면 x값을 기준으로 오름차순 정렬
                return o1[0] - o2[0];
            }
        });

        ...
        ...
    }
}