티스토리 뷰

백준/골드

[백준 1188번] 음식 평론가 (C++)

게임개발기원 2025. 4. 28. 05:11

문제링크 : https://www.acmicpc.net/problem/1188

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N, M;
    cin >> N >> M;
    
    cout << M-gcd(N, M);
    return 0;
}

 

최대공약수를 써야한다는 것은 알았지만, 정확히 이해가 가지 않아 시간이 소요된 문제이다.

 

먼저 m개를 n명에게 배분해야 하기에 소세지를 m/n을 하여 배분하면 된다.

하지만 나누어 떨어지지 않는 경우는 잘라야 하는 필요성이 생긴다.

따라서 gcd(N, M)을 구해 가능한 만큼 그룹을 나눠주고 시작한다.

여기서 각 그룹의 인원 수는 m/gcd(N, M)이다.

추가적으로 해당 그룹 인원 수를 자르는 횟수는 m/gcd(N, M)-1이다.

근데 나눈 그룹과 각 자라는 횟수는 gcd(N, M)개 만큼 있으므로, 최종적으로 gcd(N, M) * (m/gcd(N, M)-1)이 된다.

이를 풀어서 써주면 M-gcd(N, M)이다.

예시 : N=8, M=12
gcd(N, M) = 4

그룹 나누기 
n/gcd(N,M) = 2
m/gcd(N,M) = 3

3 3 3 3
2 2 2 2

그룹 (3, 2)에 대해 잘라야 하는 횟수는 2번 
(기본 2개를 1명한테 주면 나머지 2명에게 줄 것이 필요 -> 2개 빵을 2번 나눠서 공평하게 분배)
이러한 그룹이 4개(gcd(N,M)임
따라서 정답은 2*4

 

'백준 > 골드' 카테고리의 다른 글

[백준 2877번] 4와 7 (C++)  (0) 2025.04.30
[백준 1790번] 수 이어 쓰기 2 (C++)  (0) 2025.04.29
[백준 1405번] 미친 로봇 (C++)  (0) 2025.04.27
[백준 1484번] 다이어트 (C++)  (0) 2025.04.25
[백준 1027번] 고층 건물 (C++)  (0) 2025.04.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함