[Gold IV] 음식 평론가 - 1188
선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다.
선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다.
예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네 번 자르게 된다. 다른 경우로 소시지가 3개, 평론가가 4명 있는 경우를 생각해보자. 이때는 각 소시지의 크기를 3:1로 잘라서 큰 조각을 평론가에게 하나씩 주고, 남은 조각을 평론가에게 주면 모두 동일한 양을 받게 된다.
소시지의 수와 평론가의 수가 주어졌을 때, 모든 평론가에게 같은 양의 소시지를 주기 위해 필요한 칼질의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)
출력
첫째 줄에 모든 평론가에게 동일한 양을 주기 위해 필요한 칼질 횟수의 최솟값을 출력한다.
*접근 방법
규칙성이 보여 규칙을 찾았다고 생각하여 그리디(?), 수학적(?)이게 계산식을 세웠다. 그러나, 반례를 찾지 못하고 17%에서 계속 실패하여 풀이를 보게 되었다. 최대공약수를 이용한 문제였다.
-실패했던 풀이
n, m = map(int,input().split())
answer = 0
def fu(n, m):
global answer
a = m//n*n
b = 1
if m % n != 0:
b = m % n
answer = (a-n) + a * b
else:
a -= n
answer = a
if n < m:
fu(n, m)
else:
if n % m != 0:
while n > m:
n -= m
fu(n, m)
print(answer)
예를 들어, n,m = 3,4일 경우, 3x1=답:3
3x1 => 여기서 3을 도출한 방법은 m보다 작은 n의 배수 중 최댓값 : 3 , 1은 m%n
m%n == 0이면 n*1
n이 m보다 클 경우 n이 m보다 작아질 때까지 n-=m처리 후 사용
*풀이 방법
m - n, m의 최대공약수를 구하면 끝이었다.
토탐정으로 제대로 분류를 안했는지 수학 문제가 나왔다. 문제를 잘 선정해야겠다..
답:
import math
n, m = map(int, input().split())
print(m - math.gcd(n, m))
'알고리즘' 카테고리의 다른 글
[Gold III] 등수 찾기 - 17616 (bfs) (0) | 2023.05.15 |
---|---|
[Gold III] 욕심쟁이 판다 - 1937 (dfs, dp) (1) | 2023.05.14 |
[Gold I] 도로포장 - 1162 (다익스트라) (1) | 2023.05.11 |
[Gold II] 가운데를 말해요 - 1655 ( 우선순위 큐 ) (1) | 2023.05.10 |
[Gold III] 마라톤 2 - 10653 (DP) (1) | 2023.05.07 |