문제
선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다.
선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다.
예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네 번 자르게 된다. 다른 경우로 소시지가 3개, 평론가가 4명 있는 경우를 생각해보자. 이때는 각 소시지의 크기를 3:1로 잘라서 큰 조각을 평론가에게 하나씩 주고, 남은 조각을 평론가에게 주면 모두 동일한 양을 받게 된다.
소시지의 수와 평론가의 수가 주어졌을 때, 모든 평론가에게 같은 양의 소시지를 주기 위해 필요한 칼질의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)
출력
첫째 줄에 모든 평론가에게 동일한 양을 주기 위해 필요한 칼질 횟수의 최솟값을 출력한다.
문제 풀이 :
이 문제를 처음 접근하였을 때는 나는 If ~ else if ~ else로 경우의 수를 나누어 풀었으나 계속해서 오답이 떴다.
그리고 문제를 보다가 깨닫게 되었는데, 이 문제는 최대공약수를 통해서 풀어야한다.
평론가의 인원수를 M, 소세지의 갯수를 N이라 하였을때,
평론가 1명이 가져가는 소세지의 양은 N/M이다.
즉, 소시지를 N개 이어붙일 경우 (M - 1)번의 칼질이 필요하지만, N이 M으로 나누어 떨어질 경우에는 칼질이 전혀 필요없다.
따라서, M - GCD(N, M)번의 칼질이 필요하다. (최악의 경우 GCD(N, M) = 1이기 때문에 (M - 1)번의 칼질)
내 코드 :
sausage, critic= map(int, input().split())
def Sausage_cut(S, C) :
if S % C == 0 :
return C
return Sausage_cut(C, S%C)
print(critic-Sausage_cut(sausage,critic))
'BaekJoon' 카테고리의 다른 글
[백준 알고리즘] 10974번 : 모든 순열 (JAVA) 문제 풀이 (0) | 2022.12.28 |
---|---|
[백준 알고리즘] 1025번 : 제곱수 찾기 (JAVA) 문제 풀이 (0) | 2022.12.26 |
[백준 알고리즘] 5430번 : AC (Python) 문제 풀이 (0) | 2022.12.22 |
[백준 알고리즘] 10814번 : 나이순 정렬 (JAVA) 문제 풀이 (0) | 2022.12.12 |
[백준 알고리즘] 9012번 : 괄호 (JAVA) 문제 풀이 (0) | 2022.12.12 |