백준
백준 정렬 - 11650번 : 좌표 정렬하기
맴썰
2022. 2. 9. 01:39
https://www.acmicpc.net/problem/11650
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 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];
StringTokenizer st;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
a[i][0] = Integer.parseInt(st.nextToken());
a[i][1] = Integer.parseInt(st.nextToken());
}
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][0]<a[target][0]) {
sorted[idx++] = a[start];
start++;
}
else if(a[start][0]==a[target][0]){
if(a[start][1]<=a[target][1]) {
sorted[idx++] = a[start];
start++;
}
else {
sorted[idx++] = a[target];
target++;
}
}
else if(a[start][0]>a[target][0]){
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];
}
}
}
입력받는 배열을 n*n 사이즈로 해놓고 발견을 못해서 한참 고생했다. 이런