본문 바로가기
알고리즘 풀이/백준

[BOJ] 3036. 링 - JAVA

by 2245 2023. 1. 20.

🔗 문제

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

 

3036번: 링

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

www.acmicpc.net

 

🧩 풀이 및 코드

문제 유형 : 정수론, 유클리드 호제법

 

유클리드 호제법

유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.

 

예시

1071과 1029의 최대공약수를 구하면,

  • 1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. ≫ 42
  • 1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. ≫ 21
  • 42는 21로 나누어 떨어진다.

따라서, 최대공약수는 21이다.

78696과 19332의 최대공약수를 구하면,

    78696 = 19332×4 + 1368
    19332 = 1368×14 + 180
     1368 = 180×7 + 108
      180 = 108×1 + 72
      108 = 72×1 + 36
       72 = 36×2 + 0

 

(출처 : 

 

나머지 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 나머지(영어: remainder)는 산술에서 두 정수의 나눗셈 이후, 온전한 정수 몫으로 표현할 수 없이 남은 양을 가리킨다. 잉여(剩餘)라고도 한다. 선형 등식의 일반적

ko.wikipedia.org

)

 

최대공약수를 구하는 자바 코드

 public static int gcd(int p, int q)
 {
	if (q == 0) return p;
	return gcd(q, p%q);
 }

 

 

전체 코드

import java.io.*;
import java.util.*;

public class Main_bj_3036_링 {

	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/input_bj_3036.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int first = Integer.parseInt(st.nextToken());
		StringBuilder sb = new StringBuilder();
		for(int i=1; i<N; i++) {
			int next = Integer.parseInt(st.nextToken());
			
			// first 와 next 의 최대 공약수 구하기
			int res = gcd(first, next);
			sb.append(first/res).append("/").append(next/res).append("\n");
		}
		
		System.out.println(sb.toString());
		br.close();
	}
	
	public static int gcd(int p, int q) {
		if(p%q == 0) return q;
		return gcd(q, p%q);
	}

}

 


Reference

https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95

 

유클리드 호제법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란

ko.wikipedia.org

 

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

[BOJ] 1676. 팩토리얼 0의 개수 - JAVA  (0) 2023.01.27
[BOJ] 2981. 검문 - JAVA  (0) 2023.01.24
[BOJ] 1004. 어린왕자 - JAVA  (1) 2023.01.19
[BOJ] 2448. 별 찍기 - 11 - JAVA  (0) 2022.12.16
[BOJ] 1976. 여행 가자 - JAVA  (0) 2022.12.15