View

300x250

문제링크

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

문제

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

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

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

조건

  • 시간 제한 : 1s
  • 메모리 제한 : 128MB

해설

최대공약수를 찾고, 최소공배수를 찾는 방식을 사용하면 쉽게 이 문제를 해결할 수 있다.

풀이

최대공약수를 찾는 방법 : 양 쪽의 수가 같아질 때 까지 두 수 중 큰 수에서 작은 수를 빼면서 값을 비교한다. 양쪽 값이 같아지면 최대공약수를 찾을 수 있다.

입력받은 수가 AxC BxC 이고, AxC < BxC 라고 하면,
AxC > (B-A)xC
(2A-B)xC < (B-A)xC
...
YxC = ZxC → Y와 Z가 1일 때 최대공약수인 C를 찾을 수 있다.

이를 코드로 구현하면 아래와 같다.

int factA = A, factB = B;
while(factA != factB) {
    if(factA < factB) {
        factB -= factA;
    } else {
        factA -= factB;
    }
}
cout << factA << '\n';

최소공배수를 찾는 방법 : 양 쪽의 값 중 더 작은 값에 원래 값을 더하면서 양쪽의 두 값이 같아질 때 까지 비교한다. 같아지면 이게 최소공배수이다. 이를 코드로 구현하면 아래와 같다.

int multA = A, multB = B;
while(multA != multB) {
    if(multA < multB) {
        multA += A;
    } else {
        multB += B;
    }
}
cout << multA << '\n';

코멘트

이정도는 쉽게 해결할 수 있다. 생각보다 괜찮은 풀이 방법을 찾아낸 것 같다.


코드

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int A, B;
    cin >> A >> B;
    
    int factA = A, factB = B;
    while(factA != factB) {
        if(factA < factB) {
            factB -= factA;
        } else {
            factA -= factB;
        }
    }
    cout << factA << '\n';
    
    int multA = A, multB = B;
    while(multA != multB) {
        if(multA < multB) {
            multA += A;
        } else {
            multB += B;
        }
    }
    cout << multA << '\n';
    
    return 0;
}

320x100

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

[백준] 11047 - 동전 0  (0) 2021.12.26
[백준] 2294 - 동전 2  (0) 2021.12.26
[백준] 1011 - Fly me to the Alpha Centauri  (0) 2021.12.26
[백준] 14889 - 스타트와 링크  (0) 2021.12.26
[백준] 12865 - 평범한 배낭  (0) 2021.12.25
Share Link
reply
반응형
«   2024/12   »
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