[ 백준 ] 4307 / 개미

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
183/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 4307 / 개미
 *
 * Kind :: Math
 *
 * Insight
 * - 개미가 모두 땅으로 떨어지는 가능한 시간 중
 *   가장 빠른 시간은
 *   + 어느쪽이든 막대의 끝에서 가장 멀리 떨어진 개미가
 *     가장 빨리 떨어질 때 까지 걸리는 시간이다
 *     # 어떤 개미가 자신과 가장 가까운 막대 끝으로 걸어가서 떨어지는 것이
 *       그 개미에게 있어서 가장 빨리 떨어지는 방법이다
 *       -> 모든 개미가 자신과 가장 가까운 막대 끝으로 걸어가되
 *          그 중 떨어지는데 가장 시간이 오래걸린 개미가 분명 있을 것이고,
 *          이 때가 바로 모든 개미가 땅으로 떨어지는 가장 빠른 시간이다
 *
 * - 개미가 모두 땅으로 떨어지는 가능한 시간 중
 *   가장 늦은 시간은...
 *   + 모든 개미의 방향을 사전에 정해주고 시뮬레이션을 돌려서 구해야 할려나...?
 *     # 근데 100,000 마리의 개미의 방향을 모두 정한다고?
 *       -> 딱 봐도 불가능할 것 같다
 *
 * - 두마리의 개미 a,b 가 있다고 하자
 *   a =>                <= b
 *   + 화살표의 방향대로 a 개미는 오른쪽으로, b 개미는 왼쪽으로 이동한다
 *     그러면 어느순간 가운데서 충돌하게 된다
 *     그리고 반대방향으로 이동할 것이다
 *            <= ab =>
 *     # a 개미가 늦게 떨어질까 아니면 b 개미가 늦게 떨어질까? <= 몰라
 *       만약 c 개미가 a 개미 왼쪽에서 오른쪽방향으로
 *       d 개미가 b 개미 오른쪽에서 왼쪽으로 오고 있었다고 한다면
 *       c => a =>                       <= b <= d
 *       문제는 더욱 어려워진다...
 *       a 개미와 b 개미가 충돌하고, a 개미와 c 개미와 충돌하고, b 개미와 d 개미와 충돌하고,
 *       다시 a 개미와 b 개미가 충돌하고...
 *       -> 그런데 우리는 개미가 모두 땅으로 떨어지는 가능한 시간 중
 *          가장 늦은 시간을 구하고 있다
 *          즉, 그때 가장 마지막에 떨어진 개미를 구하는 것이 아니다!!!
 *
 * - 이렇게 생각해보면
 *   a =>    <= b
 *   에서, a 와 b 가 충돌한후
 *   +    <= ab =>
 *     처럼이 아니라
 *        <= ba =>
 *     처럼 생각해볼 수 있다.
 *     # 즉, 두 개미가 충돌할 때 방향을 바꾸지 않고 서로를 통과하는 것이다
 *       이렇게 생각해도 전체 개미의 움직임은 그 전과 같다!
 *       -> 그렇다면, 이 경우 떨어지는데 가장 오래걸리는 개미는
 *          어느쪽이든 막대 끝에 가장 가깝께 위치한 개미이다 <= 다른 쪽 막대끝으로 이동
 *          물론 그 개미가 진짜 실제로 가장 늦게 떨어지는 개미는 아니지만,
 *          떨어지는데 걸리는 시간은 같을 것이기 때문이다
 *          <- 앞서 말했듯, 전체 개미들의 움직임은 똑같기 때문
 *
 * Point
 * - 발상의 전환이 필요한 문제는 역시 어렵다 :(
 *   + 그만큼 풀었을 때 행복하지만 :)
 */

# 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 T; cin >> T;

    while (T--) {
        int L, N;
        cin >> L >> N;
        int P[N];
        for (int i=0; i<N; i++)
            cin >> P[i];

        // Process
        /* fast = 개미가 모두 땅으로 떨어지는 가능한 시간 중 가장 빠른 시간 */
        int fast = min(P[0], L-P[0]); /* 첫번째 개미로 초기화 */
        /* slow = 개미가 모두 땅으로 떨어지는 가능한 시간 중 가장 늦은 시간 */
        int slow = max(P[0], L-P[0]); /* 첫번째 개미로 초기화 */
        for (int i=1; i<N; i++) {
            /* 개미들의 가장 가까운 경계까지의 거리의 최대 */
            fast = max(fast, min(P[i], L-P[i]));
            /* 개미들의 가장 먼 경계까지의 거리의 최대 */
            slow = max(slow, max(P[i], L-P[i]));
        }

        // Control : Output
        cout << fast << ' ' << slow << endl;
    }
}

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

0개의 댓글