요새 copilot이나 gpt 도움을 많이 받아서 그런지 하드코딩할 때 시간이 무척 걸리는 것을 깨닫고 생각해보니 코테 문제에 소홀했던 것 같다. 그동안 애용하던 프로그래머스가 백준허브가 무엇이 이상해졌는지 github 업로딩 기능이 망가져서 그냥 백준으로 옮겨서 티어를 올려볼까 한다.
문제만 잘 읽고 이해만 하면 10초안에 푸는 문제인데, 어디선가 본 유형임에도 익숙한 듯 해결방안이 안떠오르다가 머릿속에 직접 그려서 오른쪽에서 왼쪽을 선택하는 경우와 왼쪽에서 오른쪽을 선택하는 경우를 생각하다가, 그냥 왼쪽에 다리 도착지점만 생성하면 오른쪽은 자동결정 구조라는 것을 깨닫고 바로 조합으로 접근했다. 조합을 직접 메서드로 짜려다가 math.comb()가 생각나서 바로 활용.
import math
len_try = int(input())
for i in range(len_try):
n, m = map(int, input().split())
print(math.comb(m,n))
3개의 숫자에 대한 최소공배수를 구하는 것, 주어지는 숫자는 5개 그러므로 짜여지는 조합은 5C3 = 즉 10개의 3개 요소를 가진 집합이 생성될 수 있다. itertools.combinations는 math.comb와 다르게 조합의 경우의 수가 아닌 실제로 경우의 수 만큼 튜플을 반환한다.
3개의 숫자에 대해 정렬을 먼저 시도한 후, 작은 수 부터 2개씩 최소공배수를 구하고 결과로 나온 최소공배수와 제일 큰 수 간의 최소공배수를 구하면 3개 숫자에 대한 최소공배수를 구할 수 있다. 최소공배수는 최대공약수로 구할 수 있는데 최대공약수를 구하는 방법이 기억나지않아 "유클리드 호제법"을 다시 공부해서 코드에 그대로 적용시켜서 첫번째 수 x 두번째 수 x 두 수의 최대공약수 로 하여금 최소공배수를 얻는다.
from itertools import combinations
num_lst = list(map(int, input().split()))
index_lst = range(len(num_lst))
comb = list(combinations(num_lst, 3))
def get_GCD(a,b):
while b > 0:
a, b = b , (a % b)
return a
def get_LCM(a,b):
gcd = get_GCD(a,b)
return a * b / gcd
def get_3_LCM(a,b,c):
first_lcm = get_LCM(a,b)
second_lcm = get_LCM(first_lcm, c)
return second_lcm
temp_lst = []
for i in comb:
i = list(i)
i.sort()
temp_lst.append(get_3_LCM(i[0], i[1], i[2]))
print(int(min(temp_lst)))
최대공약수에서 머리를 썩혔는데, math.gcd(),math.lcm()이 존재했었다... 파이썬 math 좀 다시 봐야겠다. 손풀기로 낮은 티어 문제들을 봤는데 다 순수 중학수학느낌