{프로젝트 오일러/Project Euler} 5. 1~ N으로 나누어 떨어지는 수
알고리즘 공부/프로젝트 오일러(Project Euler)

{프로젝트 오일러/Project Euler} 5. 1~ N으로 나누어 떨어지는 수

한국어/Hackerrank - 한국어 버전과 문제가 다를 수 있습니다. 채점은 Hackerrank를 추천합니다.

1 <= 입력 개수 <= 10, 1 <= 입력값 <= 40

for _ in range(int(input())):
    n = int(input())
    test = 1
    while True:
        for i in range(1, n+1):
            if test%i:
                break
        else:
            print(test)
            break
        test += 1

브루트 포스 방식으로 조건에 맞을 때까지 모든 수를 시도해보는 것입니다.

test라는 변수를 만들어 1부터 n 중 하나라도 나머지가 0이 아닌 게 있다면 test를 증가시킵니다.

만약 전부 나머지가 0이면 else문으로 들어가 test를 출력하고 while문에서 break 합니다.

*for문에 else는 for문 안에서 끝까지 break가 없다면 실행됩니다.

from math import gcd
from functools import reduce

for _ in range(int(input())):
    print(reduce(lambda x,y: x*y//gcd(x,y), range(1, int(input())+1)))

또 다른 방법은 최소공배수로 1부터 n까지의 모든 수로 나누어지면 결국 1부터 n까지의 모든 수의 최소공배수와 같다.

최소공배수를 구하는 방법으로 유클리드 호제법을 이용하는데 결론적으로 두 수의 최소공배수는 두 수의 곱 / 두 수의 최대공약수이다.

그러므로 reduce함수를 이용해 계속해서 최소공배수를 구하여 출력한다.

* 유클리드 호제법을 이용한 최대공약수, 최소공배수 구하는 법과 reduce 함수에 대한 것을 스스로 찾아보시기 바랍니다.