코딩테스트/Lv1

[Python, Javascript] 백준 온라인 저지 2609번

ggulgood 2022. 4. 24. 22:21

실버 LV5 https://www.acmicpc.net/problem/2609

 

2609번: 최대공약수와 최소공배수

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

www.acmicpc.net

 

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

 

 

[Python]

 

풀이 방법:

 

두 자연수의 최대공약수를 구하는 방법으로는 유클리드 호제법이 있다.

호제법이란 주어진 두 수로 서로 다른 수를 나누어 원하는 결과를 얻는 방법을 의미한다.

 

유클리드 호제법

어떤 자연수 a, b가 있을 때 (a > b), 두 수의 최대공약수는 a를 b로 나눈 나머지와 b의 최대공약수와 같다.

python code

def gcd(a, b):
    return b if a % b == 0 else gcd(b, a % b)
 
## 최대공약수 = gcd(자연수1, 자연수2)

 

정답:

 

1) 유클리드 호제법 미사용

a, b = map(int, input().split())
 
for i in range(b, 0, -1):
    if a % i == 0 and b % i == 0:
        print(i) # 최대공약수
        print(i * a // i * b // i) # 최소공배수
        exit()

 

2) 유클리드 호제법 사용

def gcd(a, b):
    return b if a % b == 0 else gcd(b, a % b)

a, b = map(int, input().split())
g = gcd(a, b) # 최대공약수

print(g)
print(a * b // g) # 최소공배수

 

 

 

[Javascript]

 

풀이 방법:

 

두 자연수를 우선 비교하여 큰 수와 작은 수를 가름한다.

while문으로 큰 수와 작은 수의 최대공약수를 구한다.

 

 

정답:

const fs = require('fs');
const [a, b] = fs.readFileSync('/dev/stdin').toString().trim().split(' ').map(v => parseInt(v));

let [bigger, smaller] = a > b ? [a, b] : [b, a];
let gcd;
while (true) {
    const rest = bigger % smaller;
    if (rest === 0) {
        gcd = smaller;
        break;
    }
    
    bigger = smaller;
    smaller = rest;
}

console.log(gcd);
console.log(gcd * (a / gcd) * (b / gcd));