본문 바로가기

컴퓨터/백준 알고리즘

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

문제 출처: www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 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 _Position {
	int x;
	int y;
}Position;

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

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 _Position {
	int x;
	int y;
}Position;

여러 개의 x좌표와 y좌표를 입력해야 해서 보다 더 편하게 접근하기 위해서 구조체를 선언하였다.

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;

그리고 좌표 x와 y를 입력받는다.

sort(arr, arr + n, cmp);

 sort함수를 통해 배열을 정렬하는데 조건은 아래와 같다.

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

좌표 y가 같다면 좌표 x를 기준으로 올림차순으로 정렬하고 그렇지 않다면 좌표 y를 기준으로 올림차순으로 정렬한다.

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

delete[] arr;
return 0;

그리고 반복문을 통해 좌표 x, y를 출력하고 동적 할당된 arr의 메모리를 해제한다.