[ 백준 ] 2548 / 대표 자연수

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
91/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2548 / 대표 자연수
 *
 * Kind :: Math
 *
 * Insight
 * - 대표 자연수 = 주어진 모든 자연수들에 대하여 그 차이를 계산하여
 *   그 차이들 전체의 합을 최소로 하는 자연수
 *   + 이거... 중앙값인데?
 *     # 7571 / 점 모으기
 *       https://gglifer-cs.tistory.com/13
 *
 * Point
 * - 복습겸 다시생각해보자
 *   + x1, x2, x3, ..., xn 이라는 수열이 있다고 하자
 *     여기서 xk <= a <= x(k+1) 인 a 가 있다고 하자
 *     # |x1-a| + |x2-a| + ... + |xn-a| 의 최소를 구하여야 한다
 *       a 에 1 을 더하면 a 의 왼쪽에 있는 수들과 거리가 1 증가하고
 *                         오른쪽에 있는 수들과 거리가 1 감소한다
 *       a 에 1 을 빼면  a 의 왼쪽에 있는 수들과 거리가 1 감소하고
 *                         오른쪽에 있는 수들과 거리가 1 증가한다
 *       -> a 의 왼쪽에 있는 수들의 개수를 x, 오른쪽에 있는 수들의 개수를 y 라고 하면
 *          x > y 인 경우, x = y 이게끔 a 의 수를 증가시키면 전체 차이의 합이 감소한다
 *          a 가 1 증가하면 -x + y 가 되기 때문이다
 *          x < y 인 경우, x = y 이게끔 a 의 수를 감소시키면 전체 차이의 합이 감소한다
 *          a 가 1 감소하면 x + -y 가 되기 때문
 *          따라서, x = y 일 때가 전체 차이의 합의 최소이다
 *          (짝수의 경우는 x+1 = y 혹은 x = y+1 때가 전체 차이의 합의 최소이다)
 *          => a 가 중앙값일 때 위를 만족하므로 중앙값을 구하자
 *
 * - 중앙값은 구하기
 *   + 수열을 오름차순으로 정렬한다 (사실 내림차순도 상관없음)
 *     수열의 길이가 N 일 때
 *     # 홀수의 경우
 *       A[N/2] or A[(N-1)/2]
 *     # 짝수의 경우
 *       작은 중앙값 : A[(N-1)/2]
 *       큰 중앙값 :  A[N/2]
 *       -> 따라서, 대표 자연수는 A[(N-1)/2] 로 구할 수 있다
 */

# Code

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

#include <iostream>
#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 A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    sort(A, A+N);

    // Control : Output
    cout << A[(N-1)/2] << endl;
}

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

0개의 댓글