문제
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');
}
}
}
'Coding Test > 백준 - JAVA' 카테고리의 다른 글
| 백준 2751번 수 정렬하기2 (JAVA) (2) | 2025.03.03 |
|---|---|
| 백준 25305번 커트라인 (JAVA) (0) | 2025.02.26 |
| 백준 2587번 대표값2 (JAVA) (1) | 2025.02.23 |
| 백준 2750번 수 정렬하기(JAVA) (2) | 2025.02.18 |
| 백준 2839번 설탕 배달 (JAVA) (1) | 2025.02.06 |