문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입력 1
5 3 4 1 1 1 -1 2 2 3 3
예제 출력 1
1 -1 1 1 2 2 3 3 3 4
출처
- 문제를 만든 사람: baekjoon
#include <iostream>
using namespace std;
int temp[100000][2];
void MergeSort(int list[][2], int left,int mid, int right)
{
int i = left;
int j = mid + 1;
int count=left;
while (i <= mid && j <= right)
{
if (list[i][0] < list[j][0])
{
temp[count][0] = list[i][0];
temp[count++][1] = list[i++][1];
}
else if (list[i][0] > list[j][0])
{
temp[count][0] = list[j][0];
temp[count++][1] = list[j++][1];
}
else
{
if (list[i][1] < list[j][1])
{
temp[count][0] = list[i][0];
temp[count++][1] = list[i++][1];
}
else
{
temp[count][0] = list[j][0];
temp[count++][1] = list[j++][1];
}
}
}
while (i <= mid)
{
temp[count][0] = list[i][0];
temp[count++][1] = list[i++][1];
}
while (j <= right)
{
temp[count][0] = list[j][0];
temp[count++][1] = list[j++][1];
}
for (int k = left; k <= right; k++)
{
list[k][0] = temp[k][0];
list[k][1] = temp[k][1];
}
}
void Merge(int list[][2], int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
Merge(list, left, mid);
Merge(list, mid + 1, right);
MergeSort(list, left, mid, right);
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int pos[100000][2];
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> pos[i][0] >> pos[i][1];
}
Merge(pos, 0, N - 1);
for (int i = 0; i < N; i++)
{
cout << pos[i][0] << " "<< pos[i][1]<<"\n";
}
return 0;
}
728x90
반응형
'알고리즘 > solved.ac' 카테고리의 다른 글
[class2] (백준 1920) 수 찾기 (0) | 2021.10.08 |
---|---|
[class2] (백준 11651) 좌표 정렬하기 2 (0) | 2021.10.07 |
[class2] (백준 10989) 수 정렬하기 3 (0) | 2021.10.05 |
[class2] (백준 10814) 나이순 정렬 (0) | 2021.10.04 |
[class2] (백준 1181) 단어 정렬 (0) | 2021.10.03 |