๋ฌธ์
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
ํ์ด
๋๋.. ์ด๊ฒ ์ ๋ ฌ ํํธ์ ์๊ณ .. ์์ ์ฌ๋ฌ ์ ๋ ฌ๋ค์ ์ฐ๋ผ๊ณ ํด์.. ๊ทธ๊ฒ๋ค์ ์ด์ฉํด์ ํธ๋์ค ์๊ณ ......
x์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ x์ขํ๊ฐ ๊ฐ์ ๊ฒ๋ค๋ผ๋ฆฌ ๋ค์ y์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ค๊ณ ์์ฃผ ๋จธ๋ฆฌ ์ฅ์ด์ธ๋งค๋ฉฐ ์ฝ๋ฉํ๋๋ฐ..
ํ๊ณ ๋ ๋ค์ ์ฐพ์๋ณด๋ comparator๋ฅผ ์ฌ์ ์ํด์ ํธ๋ ๋ฐฉ๋ฒ์ด ์๋๋ผ ํํ
compare ์์๋๋ฐ ์ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ๋์ง..?
์ผ๋จ ๋จธ๋ฆฌ ์ฅ์ด์ธ๋งจ ์๊ฐ์ด ์๊น์ฐ๋ ๋ด๊ฐ ํผ ๋ฉ์ฒญํ ๋ฐฉ๋ฒ๋ ํจ๊ป ๊ธฐ๋กํด๋๋ค..
- ๋ฉ์ฒญํ ๋ฐฉ๋ฒ
๊ธฐ๋ณธ ํฉ๋ณ์ ๋ ฌ ๋ฉ์๋๋ฅผ ์์ ํ์ฌ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๊ฐ x๋ฅผ ๊ธฐ์ค์ผ๋ก, y๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๋ก ํ๋ค.
1. int[n][2] ํฌ๊ธฐ์ ๋ฐฐ์ด xy๋ฅผ ์ ์ธ, ์ ๋ ฅ๋ฐ์ ๊ฐ์ x๋ xy[0]์, y๋ xy[1]์ ์ ์ฅํ๋ค
2. ๋ฐฐ์ด xy๋ฅผ x๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค
3. x๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ x๊ฐ ๊ฐ์ ๊ฒ๋ผ๋ฆฌ ๋ฌถ์ด์ y๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ค๋ค.
3-1. left = 0, right = 0์ผ๋ก ์์ํ์ฌ xy[i][0] ์ xy[i+1][0] ์ ๋น๊ต
3-2. ๊ฐ์ง ์์ผ๋ฉด right์ i๋ฅผ ์ ์ฅํ ํ 0 ~ i ์ฌ์ด๋ฅผ y๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
3-3. left์ i+1์ ์ ์ฅํ ํ ๋ฐ๋ณต
3-4. for๋ฌธ ์ํ์ด ๋๋๋ฉด left~๋ฐฐ์ด์ ๋๊น์ง y๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
( ๋ง์ง๋ง์ xy[i][0] ์ xy[i+1][0] ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ง๋์ง ๋ชปํ๊ณ ๋๋ y์ ๋ ฌ ๋์ง ์์๊ธฐ ๋๋ฌธ์ )
4. ์ ๋ ฌ๋ ๋ฐฐ์ด xy ์ถ๋ ฅ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B11650_1 {
static int[][] buff;
static void mergeSortX(int[][] a, int left, int right) {
if(left < right) {
int i;
int center = (left + right) /2;
int p = 0;
int j = 0;
int k = left;
mergeSortX(a, left, center);
mergeSortX(a, center + 1, right);
for(i = left; i <= center; i++) {
buff[p][0] = a[i][0];
buff[p++][1] = a[i][1];
}
while(i <= right && j < p) {
a[k][0] = (buff[j][0] <= a[i][0]) ? buff[j][0] : a[i][0];
a[k++][1] = (buff[j][0] <= a[i][0]) ? buff[j++][1] : a[i++][1];
}
while(j < p) {
a[k][0] = buff[j][0];
a[k++][1] = buff[j++][1];
}
}
}
static void mergeSortY(int[][] a, int left, int right) {
if(left < right) {
int i;
int center = (left + right) /2;
int p = 0;
int j = 0;
int k = left;
mergeSortY(a, left, center);
mergeSortY(a, center + 1, right);
for(i = left; i <= center; i++) {
buff[p][0] = a[i][0];
buff[p++][1] = a[i][1];
}
while(i <= right && j < p) {
a[k][0] = (buff[j][1] <= a[i][1]) ? buff[j][0] : a[i][0];
a[k++][1] = (buff[j][1] <= a[i][1]) ? buff[j++][1] : a[i++][1];
}
while(j < p) {
a[k][0] = buff[j][0];
a[k++][1] = buff[j++][1];
}
}
}
static void mergeSort(int[][] a, int n) {
buff = new int[n][2];
mergeSortX(a, 0, n-1);
int left = 0, right = 0;
for(int i = 0; i < n-1; i++) {
if(a[i][0] != a[i+1][0]) {
right = i;
mergeSortY(a, left, right);
left = i+1;
}
}
mergeSortY(a, left, n-1);
buff = null;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] xy = new int[n][2];
StringTokenizer st;
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
xy[i][0] = Integer.parseInt(st.nextToken());
xy[i][1] = Integer.parseInt(st.nextToken());
}
mergeSort(xy, n);
for(int i = 0; i < n; i++) {
System.out.println(xy[i][0] + " " + xy[i][1]);
}
}
}
- comparator ์ฌ์ฉํ ๋ฐฉ๋ฒ
import java.io.*;
import java.util.*;
public class B11650_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] xy = new int[n][2];
StringTokenizer st;
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
xy[i][0] = Integer.parseInt(st.nextToken());
xy[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(xy, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]){
return o1[1] - o2[1];
}else{
return o1[0] - o2[0];
}
}
});
for(int i = 0; i < n; i++) {
System.out.println(xy[i][0] + " " + xy[i][1]);
}
}
}