https://www.acmicpc.net/problem/11651
11651번: 좌표 정렬하기 2
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
public static int[][] sorted;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] a = new int[n][2];
for(int i=0; i<n; i++){
String[] temp = br.readLine().split(" ");
a[i][0] = Integer.parseInt(temp[0]);
a[i][1] = Integer.parseInt(temp[1]);
}
br.close();
sorted = new int[n][2];
merge_sort(a,0,n-1);
sorted =null;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i=0; i<n; i++) {
bw.write(a[i][0]+" "+a[i][1]+"\n");
}
bw.close();
}
public static void merge_sort(int[][] a, int i, int j) {
if(i==j) return;
int mid = (i+j)/2;
merge_sort(a,i,mid);
merge_sort(a,mid+1,j);
merge(a,i,mid,j);
}
public static void merge(int[][] a,int i, int mid, int j) {
int idx = i;
int start = i;
int target = mid+1;
while(start<=mid&&target<=j) {
if(a[start][1]<a[target][1]) {
sorted[idx++] = a[start];
start++;
}
else if(a[start][1]==a[target][1]){
if(a[start][0]<=a[target][0]) {
sorted[idx++] = a[start];
start++;
}
else {
sorted[idx++] = a[target];
target++;
}
}
else if(a[start][1]>a[target][1]){
sorted[idx++] = a[target];
target++;
}
}
while(start<=mid) {
sorted[idx++] = a[start];
start++;
}
while(target<=j) {
sorted[idx++] = a[target];
target++;
}
for(int k = i; k<=j; k++) {
a[k] = sorted[k];
}
}
}
바로 전 문제랑 동일한 문제이다.
'백준' 카테고리의 다른 글
백준 정렬 - 10814번 : 나이순 정렬 (0) | 2022.02.09 |
---|---|
백준 정렬 - 1181번 : 단어 정렬 (0) | 2022.02.09 |
백준 정렬 - 11650번 : 좌표 정렬하기 (0) | 2022.02.09 |
백준 정렬 - 2108번 : 통계학 (0) | 2022.02.08 |
백준 정렬 - 10989번 : 수 정렬하기 3 (0) | 2022.02.08 |