[ 백준 ] 2212 / 센서

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
226/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2212 / 센서
 *
 * Kind :: Greedy
 *
 * Insight
 * - DP 로 풀려고 했으나...
 *   max(N)=10^4 이니
 *   O(N^2) 로 풀면 시간제한내에 못 풀것 같다...
 *   + Greedy 로 풀어야 하나?
 *
 * - 일단 처음에 문제가 이해가 안되어서 애먹었다
 *   질문에 나와 같은 사람이 있는 것을 보았고
 *   그 답변으로 문제를 완벽하게 이해할 수 있었다
 *   + 예제 입력 1
 *     6
 *     2
 *     1 6 9 3 6 7
 *     # 예제 출력 1
 *       5
 *       -> 집중국의 수신 가능 영역
 *          [1, 3] [6, 9]
 *
 * - 위의 예제 입력에서 센서의 좌표를 정렬하면
 *   1 3 6 6 7 9
 *   인데... 집중국을 어떻게 놓지?
 *   + 각 센서간의 거리의 최소부터 더해서
 *     최소 신장 트리를 만드는 식으로 하면 될까?
 *     각 센서를 하나의 집합으로 해서 처음엔 N 개의 집합이 있고
 *     연결해서 총 K 개의 집합이 남을 때까지 구하면 될 것 같다
 *     Union Find 알고리즘을 활용해보자
 *     # 그런데 센서의 자표의 연결이 실제로 트리도 아니고 배열로 이루어져 있어서
 *       i 번째면 i-1 번째 혹은 i+1 번째 센서랑 연결되어야 하는데
 *       Union Find 까지 활용해야 하나...? <= 좀 Too Much 아닐까?
 *       -> 1 3 6 6 7 9
 *          여기서 각 센서간의 거리는
 *          2 3 0 1 2
 *          인데... 0 부터 1 2 2 3 이렇게 순서대로 더한다면...
 *          최소 신장 트리를 만드는 관점에서는 더할 때마다 각 노드가 연결되는 거니까...
 *          처음 N 개 집합에서 각 노드를 연결해 K 개의 집합을 만드려면
 *          N-K 번 더해야 한다!!!
 *          => 2 3 0 1 2
 *             를 정렬해서
 *             0 1 2 2 3
 *             으로 만들고
 *             앞의 원소부터 차례대로 N-K 원소까지 차례대로 더해주면 되겠다!
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int K; cin >> K;
    vector<int> P(N); /* 센서의 좌표를 저장한 Vector */
    for (int i=0; i<N; i++)
        cin >> P[i];

    // Process
    sort(P.begin(), P.end()); /* 센서의 좌표 오름차순으로 정렬 */
    vector<int> D(N-1); /* 센서의 좌표간 거리를 저장한 Vector */
    for (int i=0; i<N-1; i++) {
        D[i] = P[i+1] - P[i];
    }
    sort(D.begin(), D.end()); /* 센서의 좌표간 거리를 오름차순으로 정렬 */
    int ans = 0;
    /* 센서의 좌표간 거리를 작은 것부터 순서대로 N-K 번째까지 더함 */
    for (int i=0; i<N-K; i++) {
        ans += D[i];
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글