C언어/BAEKJOON
[백준] 11650. 좌표 정렬하기
너굴맨이해치움
2022. 5. 28. 08:55
: solved.ac class 2 - silver 5
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
예제 입력
5
3 4
1 1
1 -1
2 2
3 3
예제 출력
1 -1
1 1
2 2
3 3
3 4
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x, y;
}point;
int compare(const void* a, const void* b) {
point* p1 = (point*)a;
point* p2 = (point*)b;
if (p1->x < p2->x) return -1;
else if (p1->x > p2->x) return 1;
else {
if (p1->y < p2->y) return -1;
else return 1;
}
return 0;
}
int main() {
int n;
point* list;
scanf("%d", &n);
list = (point*)malloc(n * sizeof(point));
for (int i = 0; i < n; i++) {
scanf("%d %d", &list[i].x, &list[i].y);
}
qsort(list, n, sizeof(point), compare);
for (int i = 0; i < n; i++) {
printf("%d %d\n", list[i].x, list[i].y);
}
return 0;
}
해설
: 구조체로 점의 좌표를 구현한 뒤, 변형한 compare 함수로 내장함수인 퀵 소트를 이용한다.
구조체로 점을 구현한다. int형으로 x와 y 필드를 각각 선언해 주고, 여러 개의 점을 일련으로 처리하기 위해 list를 만들어 케이스의 갯수인 n만큼의 공간을 할당해 준다.
n의 횟수만큼 list에 매달린 구조체들의 필드에 x좌표와 y좌표를 각각 입력받고,
내장함수인 qsort에 이 list와 자료 갯수 n, 자료 크기 sizeof(point), 비교함수 compare를 넘겨준 뒤
그대로 출력하면 점이 정렬되어 나온다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x, y;
}point;
int main() {
int n;
point* list;
scanf("%d", &n);
list = (point*)malloc(n * sizeof(point));
for (int i = 0; i < n; i++) {
scanf("%d %d", &list[i].x, &list[i].y);
}
qsort(list, n, sizeof(point), compare);
for (int i = 0; i < n; i++) {
printf("%d %d\n", list[i].x, list[i].y);
}
return 0;
}
비교함수는 더욱 간단하다. 비교할 두 대상을 포인터 형태로 넘겨받고,
x 필드의 크기를 비교하여 앞의 것이 더 작으면 -1, 더 크면 1을 반환한다.
만약 x 필드가 같다면 y 필드를 비교하여 같은 식으로 -1과 1을 반환하게 한다.
모두 같다면 0을 반환하게 될 것이다.
//비교 함수
int compare(const void* a, const void* b) {
point* p1 = (point*)a;
point* p2 = (point*)b;
//x를 먼저 비교해서 순서를 정하고
if (p1->x < p2->x) return -1;
else if (p1->x > p2->x) return 1;
//x가 같은 경우 y를 비교
else {
if (p1->y < p2->y) return -1;
else return 1;
}
return 0;
}