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
반응형
«   2025/05   »
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