문제풀이(Problem Solving)

백준, BOJ, 2609번 C++ [CPP]

게임이 더 좋아 2021. 6. 10. 22:28
반응형
728x170

이문제는 유클리드 호제법을 이용하면 쉽게 풀 수 있다.

풀어보자

 

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

 

 


 

 

#맞는 풀이

#include<iostream>

using namespace std;

int gcd(int a, int b)
{
	int c;
	while (b != 0)
	{
		c = a % b; //나머지
		a = b; // 몫이 다시 피제수로
		b = c; // 나머지가 제수로
	}
	return a;
}


int main(){
    int p,q;
    cin >> p >> q;
    int g = gcd(p,q);
    cout << g << '\n';
    cout << (p*q)/g << '\n';
}

 

A = Ga, B= Gb라 한다면

G는 최대공약수이고

Gab는 최소공배수이다.

 

여기서 중요한 점은 p,q가 순서가 바뀌어도 똑같다는 점이다.

즉, 크기를 구분않고 넣어도 된다.

 

 

37,64순으로 넣든 64,37을 넣든 똑같다고???

64%37 이나 37%64나 같을 결과를 보여준다는 것인데..?

64%37 == 27 이다. 37%64 == 37이다???

다른데...?

 

하지만 while문 안에 들어가면

37,64의 경우

c = 37

a = 64

b = 37

이된다.

 

64,37의 경우

c = 27

a = 37

b=27이 된다.

 

 분명 다르다..

하지만 두번째 하면 알 수 있는데

37,64의 경우 2번째는

c = 27

a = 37

b = 27

이된다.

즉, 한바퀴 더 돌뿐이지 같아진다.

 

유클리드호제법에서도 a>b일 때임이 조건으로 붙어있다.

값이 같은 이유는 유클리드 호제법에서 교환을 허용하기 때문이 아니라.

while문을 돌면서 알아서 다시 크기를 바꿔주기 때문이라고 말할 수 있다.

 

하지만 불안하면 따로 조건을 만들어주자.

 

 

728x90
반응형
그리드형

'문제풀이(Problem Solving)' 카테고리의 다른 글

백준, BOJ, 1676번 C++ [CPP]  (0) 2021.06.11
백준, BOJ, 1010번 C++ [CPP]  (0) 2021.06.11
백준, BOJ, 1037번 C++ [CPP]  (0) 2021.06.10
백준, BOJ, 13305번 C++ [CPP]  (0) 2021.06.10
백준, BOJ, 1541번 C++ [CPP]  (0) 2021.06.10