본문 바로가기

알고리즘

[백준 알고리즘 c++] 문제 60. 좌표정렬하기 11650

반응형

알고리즘

 

[문제]

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

[소스 코드]

#include <iostream>
#include <set>
#include <algorithm>

using namespace std;

int main()
{

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	//
	// 문제
	// 1. x좌표, y좌표 를 정렬하는 순서대로 출력하라
	// 입력
	// 1. N을 입력 받는다.
	// 2. N만큼 반복문을 돌리며 x, y좌표를 입력 받는다.
	// 처리
	// 1. sort 문을 써서 정렬시킨다.
	// 출력
	//

	multiset<pair<int, int>> set;

	int N = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		int X = 0;
		int Y = 0;
		cin >> X >> Y;

		set.insert({ X, Y });
	}

	//sort(set.begin(), set.end());
	for (multiset<pair<int, int>>::iterator iter = set.begin(); iter != set.end(); iter++)
	{
		pair<int, int> p1 = *iter;
		cout << p1.first << " " << p1.second << "\n";
	}


	/*for (pair <int, int> p1 : set)
	{
		cout << p1.first << " " << p1.second << "\n";
	}*/

	return 0;
}

다른 풀이)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<pair<int, int>> v;
int main() {
	int N;
	cin >> N;
	int x, y;
	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';
	}
	return 0;
}

 

[피드백]

반응형