-
프로그래머스) N개의 최소공배수 c++ 풀이알고리즘과 언어/문제풀이 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; }
'알고리즘과 언어 > 문제풀이' 카테고리의 다른 글
C++ ) 백준 1743 (0) 2022.03.23 백준 16956 늑대와 양 c++ dfs, bfs (0) 2022.01.20 프로그래머스) 최댓값과 최솟값 c++ 풀이 (0) 2022.01.04 프로그래머스) 다음 큰 숫자 (0) 2021.12.29 프로그래머스) 올바른 괄호 c++ 풀이 (0) 2021.12.29