문제

링크

풀이

#include <stdio.h>
 
struct dot {
	int x;
	int y;
};
 
void merge(struct dot d[], int l, int m, int r) { 
  int i, j, k; 
  int n1 = m-l+1; 
  int n2 = r-m; 
  struct dot L[n1], R[n2];
  
  for (i=0; i<n1; i++) {
    L[i].x = d[l+i].x; 
    L[i].y = d[l+i].y; 
	}
  for (j=0; j<n2; j++) {
    R[j].x = d[m+1+j].x; 
    R[j].y = d[m+1+j].y; 
	} 
	
	i=0, j=0, k=l;
  while (i<n1 && j<n2) { 
    if (L[i].x < R[j].x) { 
      d[k].x = L[i].x;
      d[k].y = L[i].y;
      i++; 
    } else if (L[i].x == R[j].x) {
			if (L[i].y <= R[j].y) {
				d[k].x = L[i].x;
				d[k].y = L[i].y;
				i++;
			} else {
				d[k].x = R[j].x;
				d[k].y = R[j].y;
				j++;
			}
		} else {
      d[k].x = R[j].x; 
      d[k].y = R[j].y; 
      j++; 
	  } 
    k++; 
  } 
  
  while (i < n1) { 
    d[k].x = L[i].x; 
    d[k].y = L[i].y; 
    i++, k++; 
  } 
 
  while (j < n2) { 
    d[k].x = R[j].x; 
    d[k].y = R[j].y; 
    j++, k++; 
  } 
} 
  
void mergeSort(struct dot d[], int l, int r) { 
  if (l < r) { 
    int m = l+(r-l)/2;
  
    mergeSort(d, l, m); 
    mergeSort(d, m+1, r); 
    merge(d, l, m, r); 
  } 
} 
  
int main(void) {
	int n;
	struct dot d[100001];
 
	scanf("%d", &n);
	for (int i=0; i<n; i++)
		scanf("%d %d", &d[i].x, &d[i].y);
 
	mergeSort(d, 0, n-1);
 
	for (int i=0; i<n; i++)
		printf("%d %d\n", d[i].x, d[i].y);
	return 0;
}