반응형
문제링크: 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;
}
최대 공약수를 구하는 재귀는 위와 같이 구현할 수 있다.
반응형
'알고리즘 > 구현' 카테고리의 다른 글
[백준] 2194-유닛 이동시키기(C++) (0) | 2020.05.08 |
---|---|
[백준] 1756-피자 굽기(C++) (0) | 2020.05.08 |
[백준] 1022-소용돌이 예쁘게 출력하기(C++) (0) | 2020.04.28 |
[백준] 5567-결혼식(C++) (0) | 2020.04.27 |
[백준] 2851-슈퍼 마리오(C++) (0) | 2020.04.26 |