문제 출처: www.acmicpc.net/problem/11650
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. 느낀 점
구조체를 이용하여 문제를 해결한 것은 처음이라 조금 많이 어색하지만 익숙해져야겠다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 1181번: 단어 정렬 [C++] (0) | 2021.02.15 |
---|---|
백준 알고리즘 11651번: 좌표 정렬하기 2 [C++] (0) | 2021.02.14 |
백준 알고리즘 1427번: 소트인사이드 [C++] (0) | 2021.02.12 |
백준 알고리즘 2108번: 통계학 [C++] (카운팅 정렬) (0) | 2021.02.11 |
백준 알고리즘 10989번: 수 정렬하기 3 [C++](카운팅 정렬) (0) | 2021.02.10 |