본문 바로가기
알고리즘 문제풀이/백준

[백준 1145] 적어도 대부분의 배수

by m2162003 2020. 12. 21.

www.acmicpc.net/problem/1145

 

1145번: 적어도 대부분의 배수

첫째 줄에 다섯 개의 자연수가 주어진다. 100보다 작거나 같은 자연수이고, 서로 다른 수이다.

www.acmicpc.net

백트래킹과 최소 공배수를 사용했다.

숫자가 5개라서 백트래킹을 돌렸다. 숫자 5개 중 3개를 선택하여 최소 공배수를 구한 후 가장 작은 값을 리턴한다.

#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

int res = 1000000;
int arr[5];
vector<int> selected;
int gcd(int a, int b)
{
  while (b)
  {
    int r = a % b;
    a = b;
    b = r;
  }
  return a;
}

int lcm(int a, int b)
{
  return a / gcd(a, b) * b;
}

int getLcmThree(int a, int b, int c)
{
  return lcm(lcm(a, b), c);
}

void DFS(int idx, int cnt)
{
  if (cnt == 3)
  {
    int result = getLcmThree(selected[0], selected[1], selected[2]);
    res = min(res, result);
    return;
  }

  for (int i = idx; i < 5; i++)
  {
    selected.push_back(arr[i]);
    DFS(i + 1, cnt + 1);
    selected.pop_back();
  }
}
int main(void)
{
  for (int i = 0; i < 5; i++)
  {
    scanf("%d", &arr[i]);
  }

  DFS(0, 0);

  printf("%d\n", res);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 17142] 연구소 3  (0) 2020.12.22
[백준 17144] 미세먼지 안녕!  (0) 2020.12.21
[백준 17141] 연구소 2  (0) 2020.12.19
[백준 1978] 소수 찾기  (0) 2020.12.18
[백준 6064] 카잉 달력  (0) 2020.12.18

댓글