μ½”λ”©ν…ŒμŠ€νŠΈ/BOJ

[λ°±μ€€2609]-μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜(C++)/μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•

kite707 2021. 7. 18.

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

 

2609번: μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

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

www.acmicpc.net

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ˜ 과정은 μ•„λž˜μ™€ κ°™λ‹€.

  1. 큰 숫자λ₯Ό μž‘μ€ 숫자둜 mod연산을 ν•œλ‹€.
  2. μž‘μ€ 숫자λ₯Ό 1λ²ˆμ—μ„œ κ΅¬ν•œ λ‚˜λ¨Έμ§€ mod연산을 ν•œλ‹€.
  3. μœ„ 과정을 modμ—°μ‚°μ˜ κ²°κ³Όκ°€ 0이 λ‚˜μ˜¬λ•Œ κΉŒμ§€ 계속 λ°˜λ³΅ν•œλ‹€.
  4. μ΄λ•Œ λ‚˜λˆ„λŠ” 수둜 μ‚¬μš©λœ μˆ˜κ°€ 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ λœλ‹€.

μœ„ 과정을 μ΄μš©ν•΄μ„œ 1428κ³Ό 833의 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό ꡬ해보도둝 ν•˜μž.

modμ—°μ‚°μ˜ κ²°κ³Όκ°€ 0이 λ λ•Œ λ‚˜λˆ„λŠ” μˆ˜λŠ” 119μ˜€μœΌλ‹ˆ 1428κ³Ό 833의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 119이닀. 이λ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

int gcd(int a, int b) {
	int c = a % b;
	while (c != 0) {
		a = b;
		b = c;
		c = a % b;
	}
	return b;
}

 

μ΅œμ†Œκ³΅λ°°μˆ˜ κ΅¬ν•˜κΈ°

 

μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜κΈ°λ₯Ό μ™„λ£Œν–ˆλ‹€λ©΄ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” 것은 κ°„λ‹¨ν•˜λ‹€. μˆ˜ν•™μ μœΌλ‘œ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μ˜ 곱은 두 수의 κ³±κ³Ό κ°™κΈ° λ•Œλ¬Έμ΄λ‹€.

μ΅œλŒ€κ³΅μ•½μˆ˜*μ΅œμ†Œκ³΅λ°°μˆ˜ = 두 수의 κ³±

즉 μ•„λž˜μ™€ 같이 ꡬ할 수 μžˆλ‹€.

int lcm(int a, int b) {
	return (a * b) / gcd(a, b);
}

전체 μ½”λ“œ

 

μœ„μ—μ„œ λ¬Έμ œκ°€ μš”κ΅¬ν•œλŒ€λ‘œ 두 수λ₯Ό μž…λ ₯λ°›μ•„ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό 좜λ ₯ν•˜λŠ” μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

#include <iostream>
using namespace std;

int gcd(int a, int b) {
	int c = a % b;
	while (c != 0) {
		a = b;
		b = c;
		c = a % b;
	}
	return b;
}

int lcm(int a, int b) {
	return (a * b) / gcd(a, b);
}

int main() {
	int n1, n2;
	cin >> n1 >> n2;
	cout << gcd(n1, n2) << "\n" << lcm(n1, n2);
}

λŒ“κΈ€