(전공복습) 데이터과학 4. 시각화
차례
상당히 씽크빅한 문제.
골드바흐의 추측을 사용해야 하는 문제다.
골드바흐 추측은 간단히 말해 모든 짝수는 두 개의 소수의 합으로 나타낼 수 있다는 추측이다.
추측인데도 문제를 푸는 데 쓸 수 있는 건, 문제 입력보다 훨씬 큰 범위에서 이미 참임이 증명되어 있기 때문이다.
어떤 수든지 소수 2 또는 3을 빼면 짝수로 만들 수 있다.
문제는 소수 네 개를 사용하므로 여기서 2를 한번 더 빼준다.
즉, 짝수에서는 4, 홀수에서는 5를 빼면 남은 수는 골드바흐 추측에 의해 두 개의 소수로 표현이 가능하다.
골드바흐의 추측을 만족하는 두 소수를 찾는 방법은 여러 가지가 있는데, 가장 나이브한 방법은 에라토스테네스의 체로 소수들을 거른 다음에 순회해서 소수들의 목록을 만드는 것이다.
이후에, 소수들의 목록을 순회하며 두 소수로 n
을 나누는 경우를 찾으면 된다.
가장 작은 소수 2 네 개의 합인 8보다 작은 수는 절대 4개의 소수로 표현할 수 없으므로 -1
을 출력해야 한다.
#!python
from sys import exit
n = int(input())
# 가장 작은 소수는 2이므로 2+2+2+2=8보다 작으면 무조건 안 된다
if n < 8:
print(-1)
exit()
# 에라토스테네스의 체
is_prime = [True for _ in range(n + 1)]
is_prime[0] = is_prime[1] = False
for i in range(2, int(n ** (1 / 2)) + 1):
if is_prime[i]:
for j in range(2 * i, n + 1, i):
is_prime[j] = False
# 체를 순회하면서 소수 리스트를 만들어준다
primes = []
for i in range(n + 1):
if not is_prime[i]:
continue
primes.append(i)
# 홀수면 4개의 수 중 2개를 2, 3으로 고정
# 짝수면 4개의 수 중 2개를 2, 2로 고정
# 홀수 - 2 - 3 = 짝수
# 짝수 - 2 - 2 = 짝수
# 짝수면 골드바흐 추측에 의해 두 개의 소수의 합으로 나타낼 수 있다
if n % 2:
n -= 5
ans = 2, 3
else:
n -= 4
ans = 2, 2
# 소수를 순회하면서 n에서 그 소수를 뺀 게 소수면 답이다
for p in primes:
if is_prime[n-p]:
print(*(ans + (p, n-p)))
break
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...