알고리즘과 언어/문제풀이

프로그래머스) N개의 최소공배수 c++ 풀이

nextcoder 2022. 1. 12. 17:02

문제

https://programmers.co.kr/learn/courses/30/lessons/12953

 

코딩테스트 연습 - N개의 최소공배수

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배

programmers.co.kr

 

주어진 숫자들의 최소공배수(모든 수들의 배수이나 가장 작은 수)를 구하는 문제이다.

 

내 풀이

최소공배수가 될 수 있는 숫자(Now)를 증가시키면서, 주어진 arr 내의 모든 요소들이 Now의 약수인지 (나눴을 때 0이 되는지) 확인했다.

 

숫자(Now)를 증가시키는 방법은, 가장 큰 수를 기점으로 2배, 3배, 4배 ... 시키는 방식을 선택했다.

 

가장 큰 수를 증가시켜야 다른 숫자보다 빨리 답에 도달할 수 있고 연산을 줄일 수 있다.

 

1. arr를 정렬한다.

2. 가장 뒤에 있는 숫자를 알아낸다. (Last)

3. Now(증가시키며 최소공배수인지 확인할 수)를 Last로 두고, Last씩 증가시킨다.

3 - 1. 그 안에서 arr 의 모든 요소들이 Now의 약수인지 확인한다. (Now가 모든 요소들의 배수인지 확인한다.)

3 - 2. 최소공배수를 찾으면 return을 통해 while문을 나온다.

 

내 코드

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> arr) {
    int answer = 0;
    int Last;
    int Now;
    bool check;
    
    sort(arr.begin(), arr.end());
    Last = arr.back();
    Now = Last;
    
    while (1)
    {
        check = 1;
        for (auto & i : arr)
            if (Now % i != 0)
            {
                check = 0;
                break;
            }
        if (check)
            return Now;
        Now += Last;
    }
}

 

 

*주의할 점 : Now를 가장 뒤에 있는 수만큼(Last)씩 증가시키지 않고, Now += Now 라고 하지 않기

 

 

다른 사람의 풀이

앞에서 부터 순차적으로 최소공배수를 구해가는 풀이가 있었다.

a 와 b 의 최소공배수는 a * b / 최대공약수 와 같다.

 

arr[i] 와 arr[i + 1]의 gcd(최대공약수)를 구하고, arr[i] * arr[i + 1] 에 나눠주며 경신해가는 풀이가 인상깊었다.

최대 공약수를 구하는 코드는

 

long long gcd(long long a, long long b)
{
    long long c;
    while (b != 0)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}