728x90

문제

상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 

상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링 보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다.

링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 링의 개수 N이 주어진다. (3 ≤ N ≤ 100)

다음 줄에는 링의 반지름이 상근이가 바닥에 놓은 순서대로 주어진다. 반지름은 1과 1000를 포함하는 사이의 자연수이다.

 

출력

출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

 

예제 입력 1 

3
8 4 2

 

예제 출력 1

2/1
4/1

 

예제 입력 2

4
12 3 8 4

 

예제 출력 2

4/1
3/2
3/1

 

예제 입력 3

4
300 1 1 300

 

예제 출력 3

300/1
300/1
1/1

 

출처

Contest > Croatian Open Competition in Informatics > COCI 2006/2007 > Contest #4 3번

 

알고리즘 분류

  • 수학
  • 정수론
  • 유클리드 호제법

 

문제 출처

https://www.acmicpc.net/problem/3036

 

3036번: 링

출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

www.acmicpc.net

 


 

문제 해결 방법

  • 예제의 입력값과 출력값을 분석한 후, 다음과 같이 출력되도록 하여 문제를 해결하였다.
  • 첫 번째 반지름 값(firstR)이 대표 링의 반지름 길이이다.
    • firstR 변수와 나머지 변수의 값이 나누어 떨어질 경우(if (firstR % radius[i] == 0), 그 을 / 앞에, 1을 뒤에 출력시켜 준다.
    • firstR 변수와 나머지 변수의 값이 나누어 떨어지지 않을 경우(if (firstR % radius[i] != 0), 첫 번째 변수와 나머지 변수(radius[i])의 최소 공배수(lcmn)를 나머지 변수(radius[i])로 나눈 후의 몫(lcmn / radius[i])을 / 앞에, 나머지 변수(radius[i])를 나머지 변수(radius[i])와 첫 번째 변수의 최대 공약수(gcdn)으로 나눈 몫을 출력시켜 준다.
firstR = radius[0];

for (int i = 1; i < N; i++) {
    if (firstR % radius[i] == 0) {
        cout << firstR / radius[i] << "/" << 1 << '\n';
    }
    else {
        int gcdn = gcd(firstR, radius[i]);
        int lcmn = lcm(firstR, radius[i]);
        cout << lcmn / radius[i] << "/" << radius[i] / gcdn << '\n';
    }
}

 

코드

#include <iostream>
#include <vector>
using namespace std;

int N, r, firstR;
vector<int> radius;

int gcd(int x, int y) {
    if (x == 0) return y;
    else return gcd(y % x, x);
}

int lcm(int x, int y) {
    return x * y / gcd(x, y);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;
    
    for (int i = 0; i < N; i++) {
        cin >> r;
        radius.push_back(r);
    }

    firstR = radius[0];

    for (int i = 1; i < N; i++) {
        if (firstR % radius[i] == 0) {
            cout << firstR / radius[i] << "/" << 1 << '\n';
        }
        else {
            int gcdn = gcd(firstR, radius[i]);
            int lcmn = lcm(firstR, radius[i]);
            cout << lcmn / radius[i] << "/" << radius[i] / gcdn << '\n';
        }
    }

    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [정수론 및 조합론]
  • 실버IV
728x90

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ-9375][C++] 패션왕 신해빈  (0) 2022.11.15
[BOJ-1010][C++] 다리 놓기  (0) 2022.11.15
[BOJ-11051][C++] 이항 계수 2  (0) 2022.11.15
[BOJ-11050][C++] 이항 계수 1  (0) 2022.11.15
[BOJ-2981][C++] 검문  (0) 2022.11.13
[BOJ-1934][C++] 최소공배수  (0) 2022.11.13
[BOJ-2609][C++] 최대공약수와 최소공배수  (0) 2022.11.13
[BOJ-1037][C++] 약수  (0) 2022.11.12