type="nal"
[C언어]음식 평론가(백준 1188번) - 최대 공약수 구하는 함수 본문
[C언어]음식 평론가(백준 1188번) - 최대 공약수 구하는 함수
nalmi 2024. 4. 8. 18:52https://www.acmicpc.net/problem/1188
1188번: 음식 평론가
첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)
www.acmicpc.net
문제
선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다.
선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다.
예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네 번 자르게 된다. 다른 경우로 소시지가 3개, 평론가가 4명 있는 경우를 생각해보자. 이때는 각 소시지의 크기를 3:1로 잘라서 큰 조각을 평론가에게 하나씩 주고, 남은 조각을 평론가에게 주면 모두 동일한 양을 받게 된다.
소시지의 수와 평론가의 수가 주어졌을 때, 모든 평론가에게 같은 양의 소시지를 주기 위해 필요한 칼질의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)
출력
첫째 줄에 모든 평론가에게 동일한 양을 주기 위해 필요한 칼질 횟수의 최솟값을 출력한다.
문제 풀이
소시지 N개를 M명에게 나누어야 하므로 한명당 N/M크기의 소시지를 나누어줘야 함..
1. N 이 M으로 나누어 떨어지면 칼질 횟수는 0번
2. 나누어 떨어지지 않으면 최대공약수를 구하고, 이때 횟수는 M - (최대공약수)만큼이 필요하다.
최대공약수가 1인 예를들어 3, 4 일때는 4 - 1 = 3번 잘라야 하고,
18, 21 처럼 최대공약수가 3인 경우 21 - 3 = 18번 잘라야 한다.
직관적으로 이야기하면 18/21 = 인당 6/7 크기의 소시지를 갖는데, 18개의 소시지를 각각 1/7만큼 잘라서 작은 조각을 6개씩 3명에게 나누어주는 경우이다.
두 수의 최대 공약수(greatest common divisor(factor))를 구하기 위해 유클리드 알고리즘(유클리드 호제법)을 이용하기로 했다.
a, b(a>b)에 대해서 a를 b로 나눈 나머지를 r이라 하면, a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 를 구하고, 다시 r을 나머지로 나누는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
36과 21이 있을 때,
36 % 21 = 15
21 % 15 = 6
15 % 6 = 3
6 % 3 = 0으로 나누어떨어지므로, 3이 36과 21의 최대공약수이다.
알고리즘의 절차는 아래와 같다.
- 입력으로 두 수 a, b(a > b)가 들어온다.
- b가 0이라면, a를 출력하고 알고리즘을 종료한다.
- a가 b으로 나누어 떨어지면, b를 출력하고 알고리즘을 종료한다.
- 그렇지 않으면, a를 b로 나눈 나머지를 새롭게 a에 대입하고, a와 b를 바꾸고 3번으로 돌아온다.
다음 같은 코드를 짤 수 있고,
재귀함수 형태로도 만들 수 있다.
b가 0이 아니면(나눠 떨어지지 않으면) b를(a에 대입하고) 다시 나머지로 나눔.
전체코드
#include <stdio.h>
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int main(void) {
int n, m, result;
scanf("%d %d", &n, &m);
if (n % m == 0) result = 0;
else {
result = m - gcd(n, m);
}
printf("%d\n", result);
}
참고
유클리드 알고리즘: https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95
최대공약수로 접근하는 과정이 이해 잘 되길래 참고 https://physics-07.tistory.com/10
'Programming Language > C Programming Language' 카테고리의 다른 글
[C언어] main 에서 입력받은 argv[1]을 정수로 바꾸는 법 (0) | 2024.04.05 |
---|---|
[C언어] 단어 수학 (백준 1339번)-pow, Quic sort 사용 (0) | 2024.04.04 |