3036번: 링
문제 상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌�
www.acmicpc.net
문제
- 여러개의 링이 있고 그 링들의 반지름이 주어졌을때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램
입력
- 첫째 줄에 링의 개수 N (3 ≤ N ≤ 100)
- 다음 줄에는 링의 반지름 (반지름은 1과 1000를 포함하는 사이의 자연수)
출력
- 출력은 총 N-1줄을 해야 한다.
- 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력
풀이
원의 둘레 공식은 (원의 반지름)*2*π(파이) 다.
첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 출력해야하기 때문에
(첫번째 링의 둘레) / (두번째 링의 둘레)
(첫번째 링의 둘레) / (세번째 링의 둘레)
(첫번째 링의 둘레) / (세번째 링의 둘레)
같이 나오게 된다. 이때, 출력이 기약 분수 형태로 출력해야하는데 이는 분자와 분모를 각각 최소공약수로 나눠주면 쉽게 해결가능하다.
최소공약수를 구하는 알고리즘과 코드는 이전 포스팅의 풀이를 참고하면 좋다.
[JAVA] 3036번 : 최대공약수와 최소공배수
2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. www.acmicpc.net 문제 두 개의 자연수를 입력받
hu-coding.tistory.com
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 |