본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 11650번: 좌표 정렬하기 [C++]

문제 출처: 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. 코드

#include <iostream>
#include <algorithm>

using namespace std;

typedef struct {
	int x;
	int y;
}Position;

bool cmp(const Position& p1, const Position& p2)
{
	if (p1.x == p2.x)			//좌표 x가 같다면
		return p1.y < p2.y;		//좌표 y기준으로 올림차순
	else
		return p1.x < p2.x;		//좌표 x기준으로 올림차순
}

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n;
	cin >> n;
	Position* arr = new Position[n];

	for (int i = 0; i < n; i++)
		cin >> arr[i].x >> arr[i].y;

	sort(arr, arr + n, cmp);

	for (int i = 0; i < n; i++)
		cout << arr[i].x << " " << arr[i].y << "\n";

	delete[] arr;
	return 0;
}

(실행)

2. 풀이

typedef struct {
	int x;
	int y;
}Position;

다양한 x좌표와 y좌표를 입력받아야 하기 때문에 쉽게 접근하기 위해 구조체를 선언했다.

ios::sync_with_stdio(false);
cin.tie(NULL);

입출력에 의한 속도 저하를 막기 위해 C언어의 입출력의 사용제한과 입력을 우선적으로 받게 한다.

int n;
cin >> n;
Position* arr = new Position[n];

사용자에게 몇 개의 데이터 케이스를 입력할지 변수 n을 통해 입력받고 구조체 포인터 변수를 n의 크기만큼 동적 할당을 한다.

for (int i = 0; i < n; i++)
    cin >> arr[i].x >> arr[i].y;

그리고 n만큼 x 좌표와 y 좌표의 값을 입력받는다.

sort(arr, arr + n, cmp);

그리고 sort문으로 동적 할당된 arr을 cmp 함수의 기준으로 처음부터 끝까지 정렬을 시켜준다.

bool cmp(const Position& p1, const Position& p2)
{
	if (p1.x == p2.x)			//좌표 x가 같다면
		return p1.y < p2.y;		//좌표 y를 기준으로 올림차순
	else
		return p1.x < p2.x;		//좌표 x를 기준으로 올림차순
}

문제의 조건에 맞게 좌표 x가 같다면 좌표 y를 기준으로 올림차순을 하고 그렇지 않다면 좌표 x를 기준으로 올림차순을 하게 조건을 맞춘다.

for (int i = 0; i < n; i++)
    cout << arr[i].x << " " << arr[i].y << "\n";

delete[] arr;
return 0;

그리고 반복문을 통해 좌표 x와 좌표 y를 출력해주고, 동적 할당된 arr를 메모리 해제를 시켜준다.

3. 느낀 점

구조체를 이용하여 문제를 해결한 것은 처음이라 조금 많이 어색하지만 익숙해져야겠다.