View

300x250

문제 링크

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

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

조건

  • 시간 제한 : 1s
  • 메모리 제한 : 256MB

해설

x, y 좌표를 담는 구조체 position을 선언하고 input되는 좌표들을 position 배열에 담아준다. sort()함수로 구조체들을 조건에 맞게 정렬하여 출력한다.

풀이

sort() 함수는 algorithm 헤더파일에 내장되어있다. 눈여겨 볼 점은, 인자로 정렬할 데이터의 시작 메모리 위치, 끝 메모리 위치, 비교 함수를 받는다는 점이다. 아래의 코드에서 posArray가 pointer 값이므로, 배열의 시작 위치, 종료 위치, 비교함수를 인자로 넣어주었다. 주의할 점은, sort 함수의 정렬 범위는 [startAddress, endAddress)라는 점이다. 따라서, 0~number-1 까지 정렬하기에 종료 메모리 주소는 posArray+number 을 넣어주어야 한다.

sort(posArray, posArray+number, compare);

비교 함수는 조건에 맞게 아래와 같이 작성해주었다. xPos가 같을 경우 yPos를 비교하고, xPos가 다를 경우에는 xPos끼리 비교한다.

bool compare(position a, position b) {
    if(a.xPos == b.xPos) {
        return a.yPos < b.yPos;
    } else {
        return a.xPos < b.xPos;
    }
}


코멘트

이전에 나온 정렬 문제를 풀면서 3시간 넘게 고민한 것 같은데, 블로그에 올라오는 백준 알고리즘 풀이들은 다 sort함수를 사용하고 있었다. 예진이도 원래 이런거 풀 때 sort 함수를 사용해도 괜찮다고 했다. 나만 손해보면서 어렵게 풀었나 싶기도 했지만, 덕분에 pointer 개념을 다시 다잡았다고 생각한다. 그래도 sort 함수가 어떻게 사용하는 건지는 알아둬야 하기 때문에 한 번 다뤄보았다.


코드

#include <iostream>
#include <algorithm>
using namespace std;

struct position {
    int xPos;
    int yPos;
};

bool compare(position a, position b) {
    if(a.xPos == b.xPos) {
        return a.yPos < b.yPos;
    } else {
        return a.xPos < b.xPos;
    }
}

int main() {
    int number, xPos, yPos;
    cin >> number;
    
    position* posArray = new position[number];
    
    for(int i = 0; i < number; i++) {
        scanf("%d %d", &xPos, &yPos);
        posArray[i].xPos = xPos;
        posArray[i].yPos = yPos;
    }
    
    sort(posArray, posArray + (number), compare);
    
    for(int i = 0; i < number; i++) {
        printf("%d %d\n", posArray[i].xPos, posArray[i].yPos);
    }
    
    return 0;
}

320x100

'Develop > 알고리즘' 카테고리의 다른 글

[백준] 14501 - 퇴사  (1) 2021.08.13
[백준] 1920 - 수 찾기  (0) 2021.08.13
[백준] 10828 - 스택  (0) 2021.08.13
[백준] 11052 - 카드 구매하기  (0) 2021.08.13
[백준] 10816 - 숫자 카드 2  (0) 2021.08.13
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31