문제
- 여러개의 링이 있고 그 링들의 반지름이 주어졌을때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램
입력
- 첫째 줄에 링의 개수 N (3 ≤ N ≤ 100)
- 다음 줄에는 링의 반지름 (반지름은 1과 1000를 포함하는 사이의 자연수)
출력
- 출력은 총 N-1줄을 해야 한다.
- 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력
풀이
원의 둘레 공식은 (원의 반지름)*2*π(파이) 다.
첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 출력해야하기 때문에
(첫번째 링의 둘레) / (두번째 링의 둘레)
(첫번째 링의 둘레) / (세번째 링의 둘레)
(첫번째 링의 둘레) / (세번째 링의 둘레)
같이 나오게 된다. 이때, 출력이 기약 분수 형태로 출력해야하는데 이는 분자와 분모를 각각 최소공약수로 나눠주면 쉽게 해결가능하다.
최소공약수를 구하는 알고리즘과 코드는 이전 포스팅의 풀이를 참고하면 좋다.
gcd() 메소드를 사용할 때 주의점은 a를 b로 나눠주기 때문에 a>b라는 조건을 내포하고 있다는 점이다.
따라서 gcd 메소드에 매개변수를 줄 때, max, min함수를 이용해 더 큰 값을 첫번째 인자로, 작은 값은 두번째 인자로 줘야한다.
public class bj3036 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int n = s.nextInt(); // 링의 개수 n개
int r[] = new int[n+1]; // 링의 반지름
for(int i=1;i<=n;i++)
r[i]=s.nextInt();
for(int i=2;i<=n;i++) {
int gcd = gcd(Math.max(r[1], r[i]),Math.min(r[1], r[i]));
System.out.print(r[1]/gcd); //분자
System.out.print("/"); // 분수 막대
System.out.println(r[i]/gcd); //분모
}
}
// 최대 공약수 구하는 함수
public static int gcd(int a, int b) {
while(b!=0) {
int r = a%b;
a=b;
b=r;
}
return a;
}
}
'Algorithm & Data Structure > 백준' 카테고리의 다른 글
[JAVA] 백준 1026번 : 보물 (0) | 2020.05.22 |
---|---|
[JAVA] 백준 1890번 : 점프 (0) | 2020.05.22 |
[JAVA] 백준 2609번 : 최대공약수와 최소공배수 (0) | 2020.05.17 |
[JAVA] 백준 14501번 : 퇴사 (0) | 2020.05.16 |
[JAVA] 백준 1932번 : 정수 삼각형 (0) | 2020.05.15 |