이번 문제는 최대공약수 개념만 이해하면 어렵지 않게 풀 수 있습니다. 반지름의 길이 비율의 역수배로 다음 링은 회전을 하게 됩니다.
예를 들어서 첫번째 링의 반지름이 3이고, 두번째 링의 반지름이 6이라면, 두번째 링은 첫번째 링보다 반지름이 2배이므로, 회전수는 1/2가 됩니다. 이것을 이해한다면, 어렵지 않게 문제를 풀 수 있습니다.
이 C/C++ 프로그램은 Baekjoon 문제 #3036 “Ring”에 대한 솔루션입니다. 이 문제는 여러 개의 톱니바퀴가 있을 때 첫 번째 톱니바퀴의 회전수를 기준으로 다른 톱니바퀴의 회전수를 간단한 분수로 나타내는 문제입니다. 코드를 단계별로 설명하겠습니다.
//------------------------------------------------
// baekjoon #3036 Ring
// - by Aubrey Choi
// - created at 2019-06-28
//------------------------------------------------
#include <stdio.h>
int gcd(int a, int b)
{
while(b)
{
int t = b;
b = a % b;
a = t;
}
return a;
}
int main()
{
int n, a, b, g;
scanf("%d", &n);
scanf("%d", &a);
while(--n)
{
scanf("%d", &b);
g = gcd(a, b);
printf("%d/%d\n", a / g, b / g);
}
return 0;
}
코드 설명
1. gcd 함수:
• gcd(int a, int b) 함수는 두 정수 a와 b의 최대공약수(GCD)를 구하는 함수입니다. 유클리드 알고리즘을 사용하여 구현되었습니다.
• 이 함수는 b가 0이 될 때까지 a를 b로 나누어 나머지를 b에 저장하면서 a와 b의 값을 교환합니다.
• 최종적으로 a의 값이 최대공약수가 되어 반환됩니다.
2. main 함수:
• main 함수에서는 먼저 총 톱니바퀴의 수 n을 입력받습니다.
• 그리고 첫 번째 톱니바퀴의 회전수를 a에 저장합니다.
• 그 다음, 남은 n-1개의 톱니바퀴에 대해 반복문을 돌면서 회전수를 b에 입력받습니다.
• 각 톱니바퀴의 회전수를 a와 비교해 최대공약수 g를 구합니다.
• a/g와 b/g를 출력하여 첫 번째 톱니바퀴와의 회전수 비율을 간단한 분수 형태로 표시합니다.
• printf("%d/%d\n", a / g, b / g);는 a를 기준으로 간단한 형태의 비율을 보여줍니다.
예제
만약 입력이 다음과 같다면:
3
12
3
8
이 경우:
• 첫 번째 입력 12가 기준이 됩니다.
• 두 번째 입력 3에 대해, gcd(12, 3)의 결과는 3이므로 12/3 = 4와 3/3 = 1이 되어 출력은 4/1입니다.
• 세 번째 입력 8에 대해, gcd(12, 8)의 결과는 4이므로 12/4 = 3과 8/4 = 2가 되어 출력은 3/2입니다.
따라서 최종 출력은:
4/1
3/2
이 프로그램은 주어진 톱니바퀴 회전수들을 비교해 첫 번째 톱니바퀴를 기준으로 한 비율을 간단한 분수로 출력해주는 역할을 합니다.
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #3079 입국심사(이분탐색) (0) | 2024.11.12 |
---|---|
[C/C++] 백준 #3055 탈출(너비 우선 탐색) (2) | 2024.11.07 |
[C/C++] 백준 #3013 부분 수열의 중앙값(누적 합) (0) | 2024.09.30 |
[C/C++] 백준 #2981 검문(유클리드 호제법) (0) | 2024.09.20 |
[C/C++] 백준 #2887 행성 터널(크루스칼 알고리즘) (0) | 2024.08.25 |
댓글