반응형

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

 

1188번: 음식 평론가

문제 선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다. 선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다. 예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네

www.acmicpc.net

 

소시지를 하나로 이어붙인 상태 즉, n = 1일때 m - 1번 잘라야 모두에게 같은 크기의 소시지를 줄 수 있다.

 

즉, 최악의 경우 m - 1 최소의 경우 0번이다. 

 

그렇다면 소시지가 여러개가 있을 때 어떻게 해야할까?

 

최대공약수를 생각해보면 답이 나온다. 

 

소시지를 일자로 두고 일정한 크기 만큼 자를 때 두 수의 (최대 공약수 - 1)  만큼 이미 잘려있을 것이다. 

 

즉 식은 b - gcd(a,b) 이다. 

 

 

#include <iostream>
using namespace std;

int n = 0, m = 0;
int GCD(int a, int b) {
	if (a%b == 0)
		return b;

	return GCD(b, a%b);
}

int main() {
	cin >> n >> m;

	cout << m - GCD(n, m) << endl;
}

 

최대 공약수를 구하는 재귀는 위와 같이 구현할 수 있다. 

반응형

+ Recent posts