※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 7571번 문제인 점 모으기이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/7571

 

7571번: 점 모으기

첫 줄에는 격자공간의 크기와 점들의 개수를 나타내는 두 정수 N과 M이 하나의 공백을 사이에 두고 주어진다. 다음의 M줄에는 각 줄마다 격자공간내의 점의 위치를 나타내는 두 개의 정수가 하나

www.acmicpc.net

이 문제는 다음 두가지 생각을 하면 간단히 풀 수 있다.

(1) 점을 특정 좌표로 모으기 위해 필요한 좌우방향 움직임 횟수와 상하방향 움직임 횟수는 서로 영향을 주지 않는다.

(2) 모으려는 점의 x(또는 y)좌표를 기준으로 좌우(또는 상하)에 있는 점의 개수의 차이가 최소여야한다. 이 성질을 가지고 있는 x(또는 y)좌표를 구하는 방법은 정렬을 이용하는 것이다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using std::cin;
using std::cout;
using std::sort;

int x[100001];
int y[100001];

int main()
{
    std::ios::sync_with_stdio(0);
    cin.tie(0);

    int N, M;
    cin >> N >> M;
    int tempx, tempy;
    for (int i = 1;i <= M;i++) {
        cin >> tempx >> tempy;
        x[i] = tempx;
        y[i] = tempy;
    }

    sort(x + 1, x + M+1); // 정렬
    sort(y + 1, y + M+1);
    int xmid = x[(M + 1) / 2]; // 원하는 성질을 가진 x좌표와 y좌표
    int ymid = y[(M + 1) / 2];
    int ans = 0;
    for (int i = 1;i <= M;i++) { // 구한 좌표로 답 구하기
        ans += abs(x[i] - xmid) + abs(y[i] - ymid);
    }

    cout << ans;

    return 0;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 7570 // C++] 줄 세우기  (0) 2021.01.16
[BOJ 7567 // C++] 그릇  (0) 2021.01.15
[BOJ 1699 // C++] 제곱수의 합  (0) 2021.01.13
[BOJ 9465 // C++] 스티커  (0) 2021.01.12
[BOJ 1300 // C++] K번째 수  (0) 2021.01.11

+ Recent posts