본문 바로가기

BOJ/수학

★ BOJ : 2981 검문 (파이썬) ★

728x90

소스코드

import sys
import math

n = int(sys.stdin.readline())

lst = [] 

for i in range(n) :
    a = int(sys.stdin.readline())
    lst.append(a)

lst.sort()

gc = []

for i in range(len(lst)-1) :
    gc.append(lst[i+1] - lst[i])

gc.sort()
mini = gc[0]

for i in range(len(gc)-1) :
    mini = math.gcd(mini,gc[i+1])

result = []

for i in range(2,int(math.sqrt(mini)+1)) :
    if mini % i == 0 :
        result.append(i)
        if ((i**2) != mini) :
            result.append(mini//i)

result.append(mini)

result.sort() 

for i in result :
    print(i,end=' ')

 

풀이

매우 어려웠다.. 

맨처음 입력을 다 받아준 후 정렬을 해줍니다. 

그 후 리스트에 앞 뒤 수들을 빼줍니다. 그러면 그 뺀 수들로 새로운 리스트를 만들어줍니다.

x가 a라는 숫자에서 b 라는 숫자까지 얼만큼을 더해야하는지 값이라면, x = a - b 이고 모든 수들이 이런 관계를 가지게 되면 x들의 최대 공약수를 구하게 되면 같은 나머지를 구할 수 있게 됩니다. 

그 최대공약수에서 약수들을 새로운 배열에 담아 출력해주면 됩니다.

 

문제

https://www.acmicpc.net/problem/2981

 

2981번: 검문

트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간

www.acmicpc.net

 

반례

4
8
24
56
68
--------
2 4
5
9
17
31
45
69
--------
2

 

728x90

'BOJ > 수학' 카테고리의 다른 글

BOJ : 9375 패션왕신해빈 (JS)  (0) 2022.12.22
BOJ : 3036 링 (파이썬)  (1) 2022.12.20
BOJ : 1934 최소공배수 (파이썬)  (0) 2022.12.20
BOJ : 2609 최대공약수와 최소공배수 (파이썬)  (0) 2022.12.20
BOJ : 1037 약수 (파이썬)  (0) 2022.12.20