본문 바로가기

백준 11650번 좌표 정렬하기(JAVA)

@6uiw2026. 1. 4. 21:42

문제

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

입력

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

출력

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

 


 

예제 입력

5
3 4
1 1
1 -1
2 2
3 3

 

예제 출력

1 -1
1 1
2 2
3 3
3 4

 

풀이

대애충 버블정렬 같은 걸로 풀면 타임아웃 나옴..

퀵정렬과 입출력시 버퍼 이용 

입출력 버퍼까지는 안해도 타임아웃은 안 당하지만 사용하면 시간이 절반으로 단축되는 magic...

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(System.in);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int n = readInt();
        int[][] coords = new int[n][2];

        for (int i = 0; i < n; i++) {
            coords[i][0] = readInt();
            coords[i][1] = readInt();
        }

        Arrays.sort(coords, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];
            return a[0] - b[0];
        });
        for (int i = 0; i < coords.length; i++) {
            sb.append(coords[i][0]).append(" ").append(coords[i][1]).append("\n");
        }
        System.out.print(sb);
    }


    private static int readInt() throws IOException {
        int out = 0;
        boolean isNegative = false;

        while(true) {
            int n = System.in.read();
            if(n <= 32) return isNegative ? (-1)*out : out;
            else if(n == '-') isNegative = true;
            else out = (out<<3) + (out<<1) + (n-'0');
        }
    }

}

 

6uiw
@6uiw :: LOG.INFO("MING's DEVLOG")

개발을 하면서 공부한 기록을 남깁니다

목차