[백준 BOJ] 11651번 좌표 정렬하기 2 (C++/cpp)

2025. 2. 22. 16:20PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/11651

 

백준 BOJ 11651번 좌표 정렬하기 2 문제 사진

 

접근 방법 - 구조체를 활용한 정렬 기초 문제

백준의 11651번 문제는 구조체 정렬을 통하여 비교적 쉽게 해결할 수 있는 문제이다.

해당 문제는, 입력으로 주어지는 여러 쌍의 (x, y) 좌표들을 아래 기준에 맞추어 정렬한 결과를 출력하면 되는 문제이다.

- y 좌표를 기준으로 오름차순 정렬한다.
- y 좌표가 같은 경우엔, x 좌표를 기준으로 오름차순 정렬한다.

 

어떠한 경우엔 x, y 좌표 모두 비교해야 하기 때문에, 2개의 정보를 하나로 묶을 수 있게끔 구조체를 정의하였다.

그리고 해당 구조체에 맞게끔 비교 함수(compare)를 별도로 구현하고, 이를 기반으로 sort() 함수를 실행하였다.

자세한 설명은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) x, y 좌표 정보를 하나에 담을 수 있게끔, 구조체(location)를 정의한다.

 

2) 1)에서 만들어둔 location 구조체를 기반으로, 구조체 배열(loca)을 미리 선언해 둔다.

(입력으로 주어지는 좌표의 개수가 최대 10만이기 때문에, 이 점을 기반으로 배열 크기를 설정해 두었다.)

 

3) 좌표의 개수(n)를 입력받는다.

 

4) n의 크기만큼 반복문을 수행하여, 구조체 배열인 loca의 요소값을 하나씩 입력받는다.

 

5) sort() 함수를 수행하여, loca의 요소들에 대하여 정렬을 수행한다.

이때, 문제 지문에 있는 정렬 기준을 sort()에 반영하기 위하여, compare() 함수를 별도로 정의하고 이를 sort() 함수에 적용하였다.

(y 좌표를 먼저 비교해 본 뒤, 두 y 좌표가 동일한 경우엔 x 좌표를 비교하게 하였다.)

 

6) 정렬이 완료된 loca의 요소들(x, y 좌표)을 순차적으로 출력한 뒤, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 11651번 코드
struct location {
	int x;
	int y;
};

bool compare(location l1, location l2) {
	if (l1.y == l2.y) {
		return l1.x < l2.x;
	}
	return l1.y < l2.y;
}

location loca[100001];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> loca[i].x >> loca[i].y;
	}
	sort(loca, loca + n, compare);

	for (int i = 0; i < n; i++) {
		cout << loca[i].x << " " << loca[i].y << endl;
	}
}

 

제출 결과

백준 BOJ 11651번 좌표 정렬하기 2 문제 C++ 제출 결과

(2022.08.01 백준 11651번 문제 제출 결과)

반응형