공부/알고리즘 문제풀이 기록

[백준 1188] 음식 평론가

도리언 옐로우 2024. 2. 23. 01:15

 

1188번: 음식 평론가

첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)

www.acmicpc.net

알고리즘 : 수학

난이도 : 골드Ⅳ

 

1. 문제요약

  • 요리사가 소시지 n개를 준비하면 이를 m명의 음식평론가가 나눠 먹는다.
  • m명의 평론가가 같은 양만큼 소시지를 받을 수 있도록 소시지를 잘라야 한다.
  • 100이하의 자연수 n,m이 입력으로 주어지면 소시지를 자르는 최소횟수를 출력한다.

2. 아이디어

  • 일단 n과 m이 서로소이면 m-1번 소시지를 잘라야 함은 자명하다.
  • n과 m이 서로소가 아닌 경우에는 어떻게 될까? 예를들어 소시지 4개를 평론가 6명이 나누어 먹는 경우를 생각해보면 소시지 2개를 평론가 3명이 나누어 먹는 경우가 두번 반복되는 것임을 알 수 있고, 답은 (3-1)의 두배인 4가 된다.
  • 즉, n과 m의 최대공약수를 구하고, m을 최대공약수 t로 나눈 m'에 대하여 (m'-1) * t가 구하는 답이된다.
  • 두 정수의 최대공약수를 구하는 방법은 유클리드 호제법 gcd(a,b) = gcd(b,a%b)를 응용하면 쉽게 구할 수 있다.

3. 구현과정

  • 두 정수의 최대공약수를 구하는 함수 gcd(x,y)를 정의한다. z = x%y라 할때, z가 1이면 y가 최대공약수가 되므로 y를 return하고, z가 1이 아니면 유클리드 호제법에 따라 gcd(y,z)를 return하면 된다.
  • n과 m을 입력받는다.
  • m을 최대공약수로 나눈 몫에 1을 빼고, 이 값에 최대공약수를 곱해주면 원하는 답이 된다.

4. 파이썬 코드

def gcd(x, y):
    z = x % y
    if z == 0:
        return y
    else:
        return gcd(y, z)

n, m = map(int, input().split())
t = gcd(n,m)
print((m // t - 1) * t)