본문 바로가기

PS/BOJ

[C++] BOJ (백준) 2609 : 최대공약수와 최소공배수

문제

2609번: 최대공약수와 최소공배수 (acmicpc.net)

 

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

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

www.acmicpc.net

코드
#include <iostream>

using namespace std;

int gcd(int x, int y) {
  for (int i = min(x, y);; i--) {
    if (x % i == 0 && y % i == 0) return i;
  }
}

int lcm(int x, int y) {
  for (int i = max(x, y);; i++) {
    if (i % x == 0 && i % y == 0) return i;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int x, y;
  cin >> x >> y;

  cout << gcd(x, y) << '\n' << lcm(x, y);
}

 

설명

브루트포스로 최대공약수는 1씩 감소, 최소공배수는 1씩 증가시켜가며 구한다.
문제 의도는 이게 아닌 것 같긴 한데 어쨌든 제한 시간 내에 풀린다.

 

코드2
#include <iostream>

using namespace std;

int gcd(int x, int y) {
  if (x == 0) return y;
  return gcd(y % x, x);
}

int lcm(int x, int y) {
  return x * y / gcd(x, y);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int x, y;
  cin >> x >> y;

  cout << gcd(x, y) << '\n' << lcm(x, y);
}

 

설명

유클리드 호제법으로 최대공약수를 구한다.
최소공배수는 '두 수의 곱 / 최대공약수'로 구할 수 있다.

코드1은 거의 200ms가 걸렸는데 코드2는 0ms로 통과하였다.

'PS > BOJ' 카테고리의 다른 글

[C++] BOJ (백준) 24901 : Binary Game 2  (0) 2023.02.28
[C++] BOJ (백준) 2751 : 수 정렬하기 2  (0) 2023.01.12
[C++] BOJ (백준) 2292 : 벌집  (0) 2022.12.25
[C++] BOJ (백준) 2231 : 분해합  (0) 2022.12.25
[C++] BOJ (백준) 2164 : 카드2  (0) 2022.12.25