[ 백준 ] 1188 / 음식 평론가

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
113/228
post-thumbnail

# Appreciation

/*
 * Problem :: 1188 / 음식 평론가
 *
 * Kind :: Math
 *
 * Insight
 * - 여러가지 테스트 케이스를 만들어 보면서 규칙을 찾을려고 했다
 *   편의상, 소시지가 x개, 평론가가 y명 있는 경우를 (x, y) 이라고 하자
 *   + (8, 6) 인 경우,
 *     일단 소시지 6개는 평론가한테 1개씩 주면 (2, 6) 인 경우와 같다
 *     # 이때, 나머지와 재귀로 풀면 되겠다고 생각했다
 *   + (2, 6) 인 경우,
 *     평론가는 1/3 씩 소시지를 얻어야 하는건 맞다
 *     일단 있는 소시지 2개 그만큼 잘라서 2사람에게 주자
 *     그렇다면 총 자른 횟수는 2 + (2, 4) 와 같게 된다
 *   + (2, 4) 인 경우,
 *     총 자른 횟수 2 + (2, 2) 와 같게 된다
 *   + (2, 2) 인 경우,
 *     소시지 개수와 평론가의 숫자가 같으므로 더 이상 자르지 않아도 된다
 *     # 이를, x %= y 해서 x == 0 이면 그만하는 것으로 처리했다
 *
 * Point
 * - 다른 사람들은 최대공약수로 풀었더라
 *   나처럼 소시지를 그때그때 적절히 배분하고 나머지는 나중에 생각할 수도 있지만
 *   소시지를 붙여서 한번에 자르는 방식도 가능하더라!
 *   역시 알고리즘은 짜릿해, 늘 새로워 (머리 좋은게 최고야)
 */

# Code

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

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
int N, M;

// Set up : Functions Declaration
int cut(int n, int m);


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

    // Set up : Input
    cin >> N >> M;

    // Process
    int ans = cut(N, M);

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

// Helper Functions
int cut(int n, int m)
{
    /* 소시지 통째로 주기 */
    n %= m;
    if (n == 0) return 0;
    /* 소시지 그때그때 잘라서 주기 + 남은 소시지와 평론가 처리 */
    return n + cut(n, m-n);
}
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글