Algorithm/πŸ‘ 문제

[2609] μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œλŒ€κ³΅λ°°μˆ˜

YURIπŸ•πŸ“πŸΆ 2019. 8. 19. 16:53
λ°˜μ‘ν˜•

문제

두 개의 μžμ—°μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ μ΅œλŒ€ κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œ 곡배수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 두 개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 이 λ‘˜μ€ 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©° 사이에 ν•œ 칸의 곡백이 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 μ€„μ—λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§„ 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό,λ‘˜μ§Έ μ€„μ—λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§„ 두 수의 μ΅œμ†Œ 곡배수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯

24 18

예제 좜λ ₯

6

72


문제 풀이

μ²˜μŒμ—” λ‹¨μˆœνžˆ ν•˜λ‚˜μ˜ μ•½μˆ˜λ₯Ό κ΅¬ν•΄μ„œ μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ „κ°œν–ˆλ‹€. ν•˜μ§€λ§Œ 인터넷을 μ°Ύμ•„λ³΄λ‹ˆ μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ΄λΌλŠ” 것을 μ•Œμ•„ λ‚Ό 수 μžˆμ—ˆλ‹€.

...더보기

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•(- 互陀法, Euclidean algorithm)은 2개의 μžμ—°μˆ˜ λ˜λŠ” 정식(整式)의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ ν•˜λ‚˜μ΄λ‹€. ν˜Έμ œλ²•μ΄λž€ 말은 두 μˆ˜κ°€ μ„œλ‘œ(δΊ’) μƒλŒ€λ°© 수λ₯Ό λ‚˜λˆ„μ–΄(陀)μ„œ κ²°κ΅­ μ›ν•˜λŠ” 수λ₯Ό μ–»λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ λ‚˜νƒ€λ‚Έλ‹€. 2개의 μžμ—°μˆ˜(λ˜λŠ” 정식) a, b에 λŒ€ν•΄μ„œ aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό r이라 ν•˜λ©΄(단, a>b), a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” b와 r의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ κ°™λ‹€. 이 μ„±μ§ˆμ— 따라, bλ₯Ό r둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ r'λ₯Ό κ΅¬ν•˜κ³ , λ‹€μ‹œ r을 r'둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ” 과정을 λ°˜λ³΅ν•˜μ—¬ λ‚˜λ¨Έμ§€κ°€ 0이 λ˜μ—ˆμ„ λ•Œ λ‚˜λˆ„λŠ” μˆ˜κ°€ a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜μ΄λ‹€. μ΄λŠ” λͺ…μ‹œμ μœΌλ‘œ 기술된 κ°€μž₯ 였래된 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œμ„œλ„ μ•Œλ €μ Έ 있으며, 기원전 300년경에 쓰인 μœ ν΄λ¦¬λ“œμ˜ γ€Šμ›λ‘ γ€‹ 제7ꢌ, λͺ…μ œ 1λΆ€ν„° 3κΉŒμ§€μ— ν•΄λ‹Ήν•œλ‹€.

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

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

λ”°λΌμ„œ, μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 36이닀.

μœ„μ˜ μ˜ˆμ‹œμ²˜λŸΌ a와 bλ₯Ό λ‚˜λˆ μ„œ κ·Έ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜κ³ , b와 κ·Έ λ‚˜λ¨Έμ§€(r)λ₯Ό λ‚˜λˆ„κ³  λ‚˜μ˜¨ r'을 rκ³Ό λ‹€μ‹œ λ‚˜λˆˆλ‹€. 이 과정을 λ‚˜λ¨Έμ§€κ°€ 0일 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄, κ·Έ μˆ˜κ°€ a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜μ΄λ‹€.

μ΅œλŒ€κ³΅λ°°μˆ˜λŠ” a와 bλ₯Ό κ³±ν•œ 값을 μ΅œλŒ€κ³΅μ•½μˆ˜λ‘œ λ‚˜λˆ„λ©΄ λœλ‹€.

λ‹€μŒ μ½”λ“œλŠ” 두가지 λ°©μ‹μœΌλ‘œ 이 문제λ₯Ό ν‘Ό 것이닀.

/* μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜ */
/* 2019-08-19 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜ */

#include <iostream>
#include <vector>
using namespace std;

int g_d=1;
/*
int main() {
	int a, b;
	int g_d = 0;
	vector <int> a_list, b_list;
	cin >> a >> b;
	for (int i = 1; i <= a; i++) {
		if (a%i == 0) a_list.push_back(i);
	}
	for (int i = b; i >= 1; i--) {
		if (b%i == 0 && g_d==0) {
			for (int j = a_list.size()-1; j >= 0; j--) {
				if (i == a_list[j]) {
					g_d = i;
					break;
				}
			}
		}
	}
	cout << g_d << endl << (a*b) / g_d << endl;
}*/

void gcd(int a, int b) {
	int tmp = a % b;
	if (tmp == 0) g_d = b;
	else {
		gcd(b, tmp);
	}
}
int main() {
	int a, b;
	cin >> a >> b;
	if (a > b) gcd(a, b);
	else gcd(b, a);

	cout << g_d << endl;
	cout << a * b / g_d;
}
λ°˜μ‘ν˜•