문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예제 입출력
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
문제 풀이
처음엔 x좌표, y좌표 따로 vector로 받아 x좌표를 오름차순으로 정렬후 x좌표가 같은 y좌표만 정렬하면 되는 간단한 문제인줄 알고 선택했다. 하지만 x좌표가 같은게 3개이상으로 넘어가는 조건을 처리하지 못할것 같아 다른 방법을 찾아봤다.
구글링을 하던중 vector의 pair라는 함수를 알게 되었고 이것을 사용하여 sort함수에 넣으면 한번에 정리된다는것을 알게되었다.
vector의 pair함수에 x와 y값을 입력받아 한번에 넣은 후 sort함수로 정렬하기만 하면 된다.
또한 출력할때 endl과 "\n"은 시간 차이가 있으니 백준을 풀때는 왠만하면 "\n"을 사용하는게 낫다.
이번문제는 endl을 사용할때는 시간초과가 뜨니 "\n"을 사용하길 바란다.
최종 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
int x, y;
vector<pair<int, int>> v;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x >> y;
v.push_back({ x, y });
}
sort(v.begin(), v.end());
for (int i = 0; i < n; i++) {
cout << v[i].first << ' ' << v[i].second << "\n";
}
}
'[Baekjoon] C++ > Silver' 카테고리의 다른 글
[baekjoon] 10814 : 나이순 정렬 (0) | 2023.08.26 |
---|---|
[baekjoon] 2563 : 색종이 (C++) (0) | 2023.08.23 |
[baekjoon] 11651 : 좌표 정렬하기2 (C++) (1) | 2023.08.22 |
[baekjoon] 1049 : 기타 (C++) (0) | 2023.08.20 |
[baekjoon] 1026 : 보물 (C++) (1) | 2023.08.19 |