728x90
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
문제 해결 방법
- 예제의 입력값과 출력값을 분석한 후, 다음과 같이 출력되도록 하여 문제를 해결하였다.
- 첫 번째 반지름 값(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
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 |