알고리즘/문제 풀이

14400번: 편의점 2

Themion 2022. 1. 10. 17:00

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

 

14400번: 편의점 2

영선이는 이번에 편의점으로 창업을 하려고 계획 중이다. 이번 창업을 위해 많은 준비를 하고 있는데, 아직 편의점을 세울 위치를 결정을 하지 못했다. 영선이는 미리 시장조사를 하여, 주요 고

www.acmicpc.net

주요 고객의 위치의 x 좌표와 y 좌표를 따로 저장한 뒤, 두 좌표의 중간값을 각각 구해 편의점의 위치로 삼는다. 이렇게 하면 모든 고객들과의 거리 합을 최소로 할 수 있다.

#include <algorithm>
#include <iostream>

using namespace std;

#define MAX_N 100000

int abs(int num) { return num < 0 ? -num : num; }

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // n: 고객의 수, coord[b][i]: i번째 고객의 집의 좌표의 (b ? y : x)값
    int n, coord[2][MAX_N];
    // 점포와 고객의 거리합의 최솟값
    long long ans = 0;

    // 문제의 조건을 입력받는다
    cin >> n;
    for (int i = 0; i < n; i++) cin >> coord[0][i] >> coord[1][i];

    // 좌표의 x값과 y값의 중간값을 각각 구한 뒤
    nth_element(coord[0], coord[0] + n / 2, coord[0] + n);
    nth_element(coord[1], coord[1] + n / 2, coord[1] + n);

    // 각 좌표값과 중간값의 차를 ans에 더해 거리합의 최솟값을 구한다
    for (int i = 0; i < n; i++) {
        ans += abs(coord[0][i] - coord[0][n / 2]);
        ans += abs(coord[1][i] - coord[1][n / 2]);
    }

    // 거리합의 최솟값을 출력
    cout << ans << '\n';

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

14490번: 백대열  (0) 2022.01.11
14425번: 문자열 집합  (0) 2022.01.11
13594번: 숨바꼭질 3  (0) 2022.01.10
백준 13460번: 구슬 탈출 2  (0) 2022.01.10
13459번: 구슬 탈출  (0) 2022.01.10