본문 바로가기
Programming/BOJ

[C/C++] 백준 #3036 링(수학)

by 작은별하나 2024. 10. 28.
반응형

이번 문제는 최대공약수 개념만 이해하면 어렵지 않게 풀 수 있습니다.  반지름의 길이 비율의 역수배로 다음 링은 회전을 하게 됩니다.

예를 들어서 첫번째 링의 반지름이 3이고, 두번째 링의 반지름이 6이라면, 두번째 링은 첫번째 링보다 반지름이 2배이므로, 회전수는 1/2가 됩니다.  이것을 이해한다면, 어렵지 않게 문제를 풀 수 있습니다.

 

rings

 

이 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

이 프로그램은 주어진 톱니바퀴 회전수들을 비교해 첫 번째 톱니바퀴를 기준으로 한 비율을 간단한 분수로 출력해주는 역할을 합니다.

728x90

댓글