[백준] 1188번: 음식 평론가 문제 풀이 파이썬

현톨·2022년 3월 19일
0

Algorithm

목록 보기
8/42

문제

선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다.

선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다.

예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네 번 자르게 된다. 다른 경우로 소시지가 3개, 평론가가 4명 있는 경우를 생각해보자. 이때는 각 소시지의 크기를 3:1로 잘라서 큰 조각을 평론가에게 하나씩 주고, 남은 조각을 평론가에게 주면 모두 동일한 양을 받게 된다.

소시지의 수와 평론가의 수가 주어졌을 때, 모든 평론가에게 같은 양의 소시지를 주기 위해 필요한 칼질의 수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 모든 평론가에게 동일한 양을 주기 위해 필요한 칼질 횟수의 최솟값을 출력한다.

풀이

N개의 소시지를 한줄로 이어 붙인다. M명의 평론가들은 각각 N/M 개의 소시지를 나눠먹게 된다. 이 때 우리는 소시지가 이어붙여진 곳은 자를 필요가 없다.
즉, N이 M으로 나눠 떨어진다면 자를 필요가 전혀 없고, 그렇지 않다면 N과 M의 최대공약수를 찾아야 한다.
최악의 경우(최대 공약수가 1인 경우) M-1만큼 잘라야 하며, N이M으로 나눠 떨어지는 수가 M과 같은 경우 M-(N과M의 최대공약수), 즉 0번 자른다는 의미이다.

전체 코드

N, M = map(int, input().split())

# a와 b의 최대 공약수
def gcd(a, b):
    if a % b == 0:
        return b
    return gcd(b, a % b)

# 최악의 경우 M-1번 잘라야 함
print(M - gcd(N, M))

대학교에서 암호학 강의를 수강했을 때, gcd를 배웠던 기억이 있다. 최대공약수를 떠올릴 수 있었기에 생각보다 빨리 풀 수 있었다.

profile
기록하는 습관 들이기

0개의 댓글