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

1) 문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
2) 입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
3) 출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입력

[접근 방법]
1. Vector STL 의 'pair' 을 이용, first 에 x좌표, second 에 y좌표를 입력받는다.
2. stable_sort 를 통해 조건에 맞게 정렬한다.
이 문제의 핵심은 다른 stable_sort 문제와 마찬가지로 'compare' 함수를 조건에 맞게 작성하는 것이다.
x좌표를 오름차순으로 정렬하되 x좌표가 같다면 y좌표를 오름차순으로 정렬하도록 만들어주면 된다.
[코드 설명]
핵심 코드인 'compare' 함수의 코드이다. 조건문을 주어 x좌표가 같다면 y좌표를 비교해 오름차순으로 정렬한다.
else 은 x좌표가 같지 않으므로 x좌표를 비교해 오름차순으로 정렬하게 만들어준다.
bool compare(const pair<int, int>&a, const pair<int, int>&b) {
if (a.first == b.first) return a.second < b.second;
else return a.first < b.first;
}
다른 정렬 문제에선 compare 함수가 비교적 간단했다.
이번 문제에선 아주 조금만 더 생각해서 응용하면 쉽게 풀 수 있다.
이정도면 문제 다 푼거다.
이후 stable_sort 돌려주면 끝.

[ 최종 코드 ]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const pair<int, int>&a, const pair<int, int>&b) {
if (a.first == b.first) return a.second < b.second;
else return a.first < b.first;
}
int main(void) {
int N;
cin >> N;
vector <pair<int, int>> v(N);
for (int i = 0; i < N; i++)
cin >> v[i].first >> v[i].second;
stable_sort(v.begin(), v.end(), compare);
for (int i = 0; i < N; i++)
cout<< v[i].first <<" " <<v[i].second<<"\n";
}
[느낀점]
stable_sort 관련 문제를 몇개 풀어봤지만 이게 가장 쉬웠다.
물론 난이도 헬인 문제 만나면 억장 무너지겠지만 조금씩 발전하는 느낌이다.


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

1) 문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
2) 입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
3) 출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입력

[접근 방법]
1. Vector STL 의 'pair' 을 이용, first 에 x좌표, second 에 y좌표를 입력받는다.
2. stable_sort 를 통해 조건에 맞게 정렬한다.
이 문제의 핵심은 다른 stable_sort 문제와 마찬가지로 'compare' 함수를 조건에 맞게 작성하는 것이다.
x좌표를 오름차순으로 정렬하되 x좌표가 같다면 y좌표를 오름차순으로 정렬하도록 만들어주면 된다.
[코드 설명]
핵심 코드인 'compare' 함수의 코드이다. 조건문을 주어 x좌표가 같다면 y좌표를 비교해 오름차순으로 정렬한다.
else 은 x좌표가 같지 않으므로 x좌표를 비교해 오름차순으로 정렬하게 만들어준다.
bool compare(const pair<int, int>&a, const pair<int, int>&b) {
if (a.first == b.first) return a.second < b.second;
else return a.first < b.first;
}
다른 정렬 문제에선 compare 함수가 비교적 간단했다.
이번 문제에선 아주 조금만 더 생각해서 응용하면 쉽게 풀 수 있다.
이정도면 문제 다 푼거다.
이후 stable_sort 돌려주면 끝.

[ 최종 코드 ]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const pair<int, int>&a, const pair<int, int>&b) {
if (a.first == b.first) return a.second < b.second;
else return a.first < b.first;
}
int main(void) {
int N;
cin >> N;
vector <pair<int, int>> v(N);
for (int i = 0; i < N; i++)
cin >> v[i].first >> v[i].second;
stable_sort(v.begin(), v.end(), compare);
for (int i = 0; i < N; i++)
cout<< v[i].first <<" " <<v[i].second<<"\n";
}
[느낀점]
stable_sort 관련 문제를 몇개 풀어봤지만 이게 가장 쉬웠다.
물론 난이도 헬인 문제 만나면 억장 무너지겠지만 조금씩 발전하는 느낌이다.

