Algorithm/acmicpc.net

최대공약수 GCD(Greatest Common Division)

winney916 2021. 12. 2. 15:40
728x90

#17087 https://www.acmicpc.net/problem/17087

 

17087번: 숨바꼭질 6

수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이

www.acmicpc.net

 

최소공약수가 필요한 문제인데, 난 여태 최소공약수 연산을 다음처럼 했었다.

def get_gcd(num1, num2):
  for i in range(max(num1, num2), 0, -1):
    if num1%i == 0 and num2%i == 0:
      return i

공약수를 구하는 상황인 만큼 두 수의 약수가 아닌 수까지 loop를 돌리는 위 코드는 무조건 시간초과가 날 수 밖에 없었다.

그렇게 얻은 솔루션은 다음과 같다.

 

def get_gcd_efficiently(num1, num2):
  if num1 > num2:
    m, n = num1, num2
  else:
    m, n = num2, num1
   
  while n:
    mod = n
    n = m%n
    m = mod
  return m

어떤 원리인지는 잘 모르겠지만 아주 효율적인 코드이다.

'Algorithm > acmicpc.net' 카테고리의 다른 글

다이나믹 프로그래밍 (Dynamic Programming)  (0) 2021.12.08
진수 계산법  (0) 2021.12.04
0의 개수  (0) 2021.11.30
익숙해지기 참 어려운 소수  (0) 2021.11.28
EOFerror : 입력이 끝날 때 종료를 원한다면!..  (0) 2021.11.25