본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[c++] 백준 11650 좌표 정렬하기

백준 단계별로 풀어보기 [정렬] 좌표 정렬하기

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

 

[풀이]

STL의 sort를 이용해서 풀었다. sort(begin, end, pred)의 3가지 인자를 전달하는데, pred 자리에는 특정한 조건을 추가 인자로 받는다. 여기서는 두 x좌표가 같은 경우 y 좌표가 증가하는 순서대로 정렬되게끔하고 그 외의 경우에는 x좌표의 크기에 따라 정렬하는 bool 함수 cmp를 전달하였다. 

마지막 줄의 출력에서 std::endl을 사용하면 시간초과가 뜨는데, 이를 "\n"으로 수정하니 괜찮아졌다...  

 

[코드]

#include <iostream>
#include <algorithm>

typedef struct{
    int x, y;
}Point;

bool cmp(const Point& a, const Point& b) {
    if (a.x == b.x)
        return a.y < b.y;
    else return a.x < b.x;

}

int main() {    
    int n;
    std::cin >> n;
    Point* point = new Point[n];

    for (int i = 0; i < n; i++) 
        std::cin >> point[i].x >> point[i].y;
    
    std::sort(point, point + n, cmp);

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

    return 0;
}