728x90
http://www.acmicpc.net/problem/17087
# 조건
- 동생 N명과 숨바꼭질
- 수빈이는 현재 점 S에 있고, 동생은 A1, A2 .. An
- 수빈이는 걸어서 이동을 할 수 있는데, 수빈이의 위치가 X일 때 걷는다면
- 1초 후에 X+D나 X-D로 이동 가능
- 수빈이의 위치가 동생이 있는 위치와 같다면 동생을 찾았다고 한다.
- 모든 동생을 찾기 위해 D의 값을 정하는데 가능한 D의 최댓값을 구하여라.
# 접근 방법
- 동생들의 위치와 현재 위치의 차이를 담은 배열을 만들어 준다.
- 이 배열들의 최대 공약수가 D가 될 수 있는 최댓값이다.
- 유클리드 호제법을 이용하여 구해주었다.
- 현재 위치를 기준으로 하면 음수가 발생할 수도 있으니 abs이용
- 다만, 파이썬에는 math.gcd를 이용하여 최대 공약수를 구할 수 있다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
sys.setrecursionlimit(10**9)
def gcd(arr, result, idx):
if idx == len(arr):
return result
a = result
b = arr[idx]
while b > 0:
a, b = b, a % b
idx+=1
return gcd(arr, a, idx)
N, S = map(int, input().split())
brother = [*map(int, input().split())]
dist = []
for i in range(N):
dist.append(abs(S-brother[i]))
print(gcd(dist, dist[0], 0))
math 모듈 사용
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from math import gcd
N, S = map(int, input().split())
brother = [*map(int, input().split())]
dist = []
for i in range(N):
dist.append(abs(S-brother[i]))
print(gcd(*dist))
728x90
'ALGORITHM > 수학, 기하학' 카테고리의 다른 글
[백준 1007번] 파이썬 - 벡터 매칭 (0) | 2023.01.07 |
---|---|
[백준 3096번] 파이썬 - 영화제 (0) | 2023.01.03 |
[백준 15657번] 파이썬 - N과 M(8) (0) | 2022.11.09 |
[백준 15654번] N과 M(5) (0) | 2022.11.08 |
[백준 15652번] N과 M(4) (0) | 2022.11.07 |