[ 백준 ] 1614 / 영식이의 손가락

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

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

# Appreciation

/*
 * Problem :: 1614 / 영식이의 손가락
 *
 * Kind :: Math
 *
 * Insight
 * - [엄지 -> 검지 -> 중지 -> 약지 -> 새끼 -> 약지 -> 중지 -> 검지] -> 엄지 -> ...
 *   [1 -> 2 -> 3 -> 4 -> 5 -> 4 -> 3 -> 2] -> 1 -> ...
 *   8 의 Cycle 을 가진다
 *
 * - Simulation 으로 풀기에는 너무 많은 시간이 든다
 *   + max(다친 손가락으로 셀 수 있는 횟수) 가 1'000'000'000 이니...
 *     엄지가 다치고 1'000'000'000 셀 수 있으면
 *     8'000'000'000 까지 셀 수 있는데, 시간 제한이 2초이므로 이를 일일이 세는 것은 불가능하다
 *
 * - 8 의 Cycle 을 이용해서 풀자
 *   Cycle 한 번 마다 (엄지, 새끼)는 1번씩 사용되고, (검지, 중지, 약지)는 2번씩 사용된다
 *   + 검지가 다치고, 3번만 셀 수 있다면(예제 입력 1),
 *     Cycle 은 1번 돌고, 2번째 Cycle 이 돌 때 검지를 쓸 수 있는 횟수가 1번 남게된다
 *     # 새로운 Cycle 이 시작할 때, 검지를 한 번 쓸 수 있다면 추가로 더 셀 수 있는 수의 값은 7
 *     # 새로운 Cycle 이 시작할 때, 검지를 한 번도 쓸 수 없다면 추가로 더 셀 수 있는 수의 값은 1
 *     # 새로운 Cycle 이 시작할 때, 새끼를 한 번 쓸 수 있다면 추가로 더 셀 수 있는 수의 값은 4
 *     # 새로운 Cycle 이 시작할 때, 약지를 한 번도 쓸 수 없다면 추가로 더 셀 수 있는 수의 값은 3
 *     -> 손가락도 5개밖에 안되니까 그냥 각각의 상황에 따라 적절하게 처리해주자
 */

# Code

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

#include <iostream>

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 f; cin >> f; /* 다친 손가락 번호 */
    long cnt; cin >> cnt; /* 다친 손가락으로 셀 수 있는 횟수 */

    // Process
    long ans; /* 셀 수 있는 수의 최댓값 */
    switch (f) {
        case 1: /* 엄지 */
            ans = cnt/1 * 8; /* Cycle 이 돌아가면서 세었던 수 */
            ans += 0; /* 새로운 Cycle 이 시작할 때
                       * 엄지로 수를 세기 전까지는 수를 더 셀 수 있음
                       * 근데, Cycle 의 처음이 엄지부터라 사실상 수를 더 셀 수 없음 */
            break;

        case 2: /* 검지 */
            ans = cnt/2 * 8; /* Cycle 이 돌아가면서 세었던 수 */
            /* Cycle 이 돌고 난 뒤 */
            (cnt % 2) ? ans += 7 : ans += 1; /* 다친 손가락으로
                                              * 한번 더 셀 수 있으면 +7, 아니면 +1 */
            break;

        case 3: /* 중지 */
            ans = cnt/2 * 8; /* Cycle 이 돌아가면서 세었던 수 */
            /* Cycle 이 돌고 난 뒤 */
            (cnt % 2) ? ans += 6 : ans += 2; /* 다친 손가락으로
                                              * 한번 더 셀 수 있으면 +6, 아니면 +2 */
            break;

        case 4: /* 약지 */
            ans = cnt/2 * 8; /* Cycle 이 돌아가면서 세었던 수 */
            /* Cycle 이 돌고 난 뒤 */
            (cnt % 2) ? ans += 5 : ans += 3; /* 다친 손가락으로
                                              * 한번 더 셀 수 있으면 +5, 아니면 +3 */
            break;

        case 5: /* 새끼 */
            ans = cnt/1 * 8; /* Cycle 이 돌아가면서 세었던 수 */
            /* Cycle 이 돌고 난 뒤 */
            ans += 4; /* 새로운 Cycle 이 시작할 때
                       * 새끼로 수를 세기 전까지는 수를 더 셀 수 있음 */
            break;

        default: throw;
    }

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

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

0개의 댓글