티스토리 뷰

알고리즘/백준

[BAEKJOON] 3036 링

응애~ 개발자 2022. 9. 23. 14:15
728x90
반응형

문제 요약

  • 알고리즘 분류: 유클리드 호제법
  • 난이도: Silver4
  • 문제내용:
    • 첫 번째 링과 그 뒤의 각 링의 비례 하는 회전 수를 기약 분수 형태로 표현해라.
  • 사이트 주소: https://www.acmicpc.net/problem/3036
 

3036번: 링

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

www.acmicpc.net

문제 풀이

1. 문제 접근 방법

 이 문제는 회전의 비례를 구해야 한다. 예를 들어 A가 20 바퀴를 돌아가고 B가 12 바퀴 돌아 간다고 가정 한다면  A : B = 20 : 12 = 10 : 6 = 5 : 3 으로 표현 할수있다. 그래서 기약 분수를 구하기 위해서는 두 수의 최대공약수를 구해야 한다.

최대 공약수는 유클리드 호제법으로 풀면  처리 시간이 모든 경우의 수를 구하는 것보다 빠르다. 유클리드 호제법에 대한 내용은 아래의 사이트에서 보면 된다.

https://jih3508.tistory.com/13

 

유클리드 호제법(Euclidean algorithm)

이론 1. 유클리드 호제법이란? 두 개의 정수 혹은 다수의 자연수에서 최대공약수를 구하는 알고리즘이다. 원리는 두 수가 서로 나눠서 나머지를 구한다. 만약 나머지가 0이면 그 수가 최대 공약

jih3508.tistory.com

   2. 문제 푸는 방법

 

  1. 첫번째 숫자 외 그 뒤의 숫자들의 최대공약수를 구한다.
  2. 첫번째 숫자와 각 숫자를 나눈다.

CODE

Python

import math

size = int(input())
numbers = list(map(int, input().split()))

basic_number = numbers[0]
for number in numbers[1:]:
    gcd = math.gcd(basic_number, number)
    print(str(basic_number // gcd) + "/" + str(number // gcd))

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int size = Integer.parseInt(br.readLine());
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int[] numbers = new int[size];
		for(int i = 0; i < size; i++) {
			numbers[i] = Integer.parseInt(st.nextToken());
		}
		
		int basic_number = numbers[0];
		for(int i = 1; i < size; i++) {
			int gcd = GCD(basic_number, numbers[i]);
			System.out.println((basic_number / gcd) + "/" + (numbers[i] / gcd));
		}
		
	}
	
	// 최대 공약수 구하는 함수
	public static int GCD(int x, int y) {
		int r;
		while(x % y != 0) {
			r = x % y;
			x = y;
			y = r;
		}
		
		return y;
	}			
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON] 1149 RGB거리  (1) 2022.09.26
[BAEJOON] 1043 거짓말  (0) 2022.09.25
[BAEKJOON] 2981 검문  (0) 2022.09.22
[BAEJOON] 1934 최소공배수  (0) 2022.09.21
[BAEKJOON] 24060 알고리즘 수업 - 병합 정렬 1  (1) 2022.09.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함