본문 바로가기
Algorithm/BOJ

[BOJ]11650번: 좌표 정렬하기 (c++)

by HBGB 2020. 7. 6.

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: pair로 펑터없이 정렬

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N;
	cin >> N;
	vector<pair<int, int>> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> v[i].first >> v[i].second;
	}

	// 오름차순 정렬
	sort(v.begin(), v.end());

	// 출력
	for (int i = 0; i < N; ++i)
	{
		cout << v[i].first << ' ' <<  v[i].second << '\n';
	}

	return 0;
}

 

방법 2: 사용자 정의 자료형의 < 연산자 오버로딩을 통한 정렬

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct point {
	int x, y;

	// < 연산자 오버로딩 : x 오름차순, y 오름차순
	bool operator <(const point& p) const 
	{
		if (x != p.x)
		{
			return x < p.x;
		}
		return y < p.y;
	}
};

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N;
	cin >> N;
	vector<point> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> v[i].x >> v[i].y;
	}

	// 연산자 오버로딩된 point벡터를 정렬
	sort(v.begin(), v.end());

	// 출력
	for (int i = 0; i < N; ++i)
	{
		cout << v[i].x << ' ' << v[i].y << '\n';
	}

	return 0;
}

 

 

방법1

pair자료형을 쓰면 별다른 펑터 없이 그냥 sort()만으로 오름차순 정렬이 된다.

하지만 사용자 정의 자료형을 쓰면 따로 사용자 정의 펑터를 만들어주어야 한다.

 

 

방법2

사용자 정의 자료형에서 연산자를 오버로딩하여 정렬할 수도 있다.

이 방법이 방법1보다 빨랐다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]10825번: 국영수 (c++)  (0) 2020.07.06
[BOJ]10814번: 나이순 정렬 (c++)  (0) 2020.07.06
[BOJ]11651번: 좌표 정렬하기 2 (c++)  (0) 2020.07.06
[BOJ]2873번: 롤러코스터 (c++)  (0) 2020.06.27
[BOJ]1201번: NMK (c++)  (0) 2020.06.27

댓글