일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 아스테리스크 #Asterisk #파이썬
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- dfs #bfs #leetcode #python
- dfs #python #leetcode
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- gcd #최대공약수 #백준 #2981 #검문
- dfs #leetcode #python
- dfs #그래프 #graph #python #leetcode #course #schedule
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- python #백준 #9375 #패션왕 #신해빈
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- dfs #bfs #이진트리 #파이썬 #리트코드
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- dfs #python #leetcode #combination
- 2004 #조합 0의 개수 #백준
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- dfs #leetcode #python #graph #그래프
- leetcode #subsets #dfs #itertools #python
- 리트코드 #팰린드롬 #파이썬
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- Python #leetcode #dfs #그래프 #백트래킹
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- final #java #자바 #안드로이드
- 코틀린 #Do it #깡샘 #안드로이드
- 파이썬 #zip
- leetcode #python #dfs #재귀
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- Today
- Total
멋진 개발자가 되고 싶다
[백준/Python] 2981. 검문 본문
문제
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다.
상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다.
먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다.
N개의 수가 주어졌을 때, 가능한 M을 모두 찾는 프로그램을 작성하시오.
입력
첫째 줄에 종이에 적은 수의 개수 N이 주어진다. (2 ≤ N ≤ 100)
다음 줄부터 N개 줄에는 종이에 적은 수가 하나씩 주어진다. 이 수는 모두 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. 같은 수가 두 번 이상 주어지지 않는다.
항상 M이 하나 이상 존재하는 경우만 입력으로 주어진다.
출력
첫째 줄에 가능한 M을 공백으로 구분하여 모두 출력한다. 이때, M은 증가하는 순서이어야 한다.
이 문제는 약간의 수학적 지식이 필요하다.
예를 들어
3개의 숫자 A, B, C가 주어졌다고 하자.
A = M * a + r
B = M * b + r
C = M * c + r
에서
B - A = M * ( b - a )
C - B = M * ( c - b )
...?
이렇게 바꾸면 결국 M으로 나눴을 때 나머지가 0이 되면 되는 거 아닌가?!
그러한 M을 모두 구하려면 M의 대장인 B-A와 C-B의 최대공약수를 구하면 된다.
이 최대공약수의 약수들이 결국 답이 되는 것이다!!
***** 나의 코드 *****
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import sys
import math
N = int(sys.stdin.readline())
nums = []
for _ in range(N):
nums.append(int(sys.stdin.readline()))
nums.sort()
subs = []
for i in range(N - 1):
subs.append(nums[i + 1] - nums[i])
prev = subs[0]
for i in range(1, N - 1):
prev = math.gcd(prev, subs[i])
result = []
for i in range(2, int(math.sqrt(prev)) + 1):
if prev % i == 0:
result.append(i)
result.append(prev // i)
result.append(prev)
result = list(set(result))
result.sort()
for i in range(len(result)):
print(result[i])
|
cs |
해설:
1. nums에 숫자를 받는다.
2. 숫자 간 차를 subs에 넣는다.
3. math.gcd를 이용하여 subs 전체에 대한 gcd를 구한다.
4. gcd의 약수를 구한다.
'Algorithm Study > 백준' 카테고리의 다른 글
[백준/Python]2004.조합 0의 개수 (0) | 2021.08.01 |
---|---|
[백준/Python] 9375.패션왕 신해빈 (0) | 2021.08.01 |
[백준/Python] 2580.스도쿠(feat.DFS) (0) | 2021.07.31 |
[백준/Python] 1697. 숨바꼭질 (0) | 2021.07.30 |
[백준/Python] 1012. 유기농 배추 (0) | 2021.07.25 |