알고리즘 문제풀이/프로그래머스
[프로그래머스] N개의 최소공배수 - 파이썬(python)
mine*
2024. 1. 4. 20:04
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.
제한사항
- arr은 길이 1이상, 15이하인 배열입니다.
- arr의 원소는 100 이하인 자연수입니다.
풀이 설계
- n개의 수의 최소공배수를 구하기 위해서 배열의 숫자를 소인수분해하여 각 소수의 최대 제곱 값을 구해야한다.
- arr의 원소는 100이하 이므로 소수의 개수를 세기 위한 배열을 설정한다. (이하 temp)
- for문을 통해 원소를 하나씩 소인수 분해 한다.
- while문을 사용하여 2부터 나누기 시작해서 num(원소)가 1이 되면 중단한다.
- 나눌 때 나머지가 남지 않는 경우 나누고 횟수를 카운트한다.
- temp배열에서 최대값을 갱신한다.
- for문이 종료된 후 temp배열이 0이 아닌 경우 해당 값을 인덱스의 제곱으로 사용하여 모두 곱한다.
코드
def solution(arr):
answer = 1
temp = [0]*101
for num in arr:
tm = 2
cnt = 0
while 1:
if num == 1:
break
if num % tm == 0:
cnt+=1
num = num // tm
temp[tm] = max(temp[tm], cnt)
else:
cnt = 0
tm+=1
for idx in range(1, 101):
if temp[idx] != 0:
answer *= idx**temp[idx]
return answer
다른 코드
- math.gcd 함수(최대공약수를 구하는 함수)를 사용하는 방법
- (주의) 파이썬 3.9미만 버전에서는 gcd인수로 2개까지 허용된다. (프로그매머스는 3.9미만)
- 3.9이상 버전에서는 gcd함수의 인수로 여러개를 사용할 수 있다.
- 3.9이상 버전에서는 lcm이라는 최소공배수를 구하는 함수도 사용 가능하다.
import math
# 최소공배수 구하는 함수
def lcm(a,b):
return a*b // math.gcd(a,b)
def solution(arr):
answer = arr[0]
for i in arr[1:]:
answer = lcm(answer,i)
return answer
유클리드 호제법
- 만약에 math 라이브러리를 사용할 수 없다면 유클리드 호제법을 사용하여 최대공약수를 구할 수 있다.
# 유클리드 호제법을 사용하여 최대공약수 구하기
def gcd(a,b):
while b:
r = a%b
a,b = b,r
return a
# 최소공배수 구하기
def lcm(a,b):
return a*b // gcd(a,b)
def solution(arr):
answer = arr[0]
for i in arr[1:]:
answer = lcm(answer,i)
return answer



후기
- 파이썬에서 내장함수나 라이브러리를 사용하는 것이 익숙하지 않아서 사용할 생각을 못해봤는데 확실히 코드가 짧아지고 읽기 쉬워지는 것 같다.
- 유클리드 호제법에 대한 이해가 필요할 것 같다.