티스토리 뷰

반응형

백준 9020번 골드바흐의 추측

 

알고리즘 분류: 수학, 정수론, 소수 판정, 에라토스테네스의 체

 

링크: https://www.acmicpc.net/problem/9020

 

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

문제

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다.

골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다.

2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다. (4 ≤ n ≤ 10,000)

출력

각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.

 

문제 파악

 

골드바흐라는 사람에 의하면 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다고 한다.

 

그렇다면 같은 숫자라도 여러개의 숫자합으로 나타낼 수 있을텐데

 

이 중에서 가장 차가 작은 수의 조합을 찾으라는 문제이다.

 

소수들을 찾고 이 중에서의 조합도 찾아야되는 까다로운 문제이다.

 

1000B가 넘는 코드 길이를 작성하고도 시간 초과에 걸리는 등 이 문제에 굉장히 어려움을 겪었다.

 

나름대로의 시간 복잡도를 줄이기 위해서 코드를 수정하면 특정 조건에서 틀리는 등

 

나에게는 좀 어려운 문제였던 것 같다.

 

구글에 검색을 하여도 다들 푸는 방식이 다르기 때문에 쉽게 이해되는 코드들이 없었다.

 

또한 많은 블로그들이 코드만 올리고 풀이를 설명해 주는 분들은 많지 않기 때문에

 

나같은 초보들은 코드를 이해할 때 어려움을 겪는 부분이 많다.

 

이번 문제는 https://has3ong.tistory.com/493 이 분의 풀이를 참고해서 풀었다.

 

그러나 이 분의 풀이를 사용하면 정답이 나오기는 하지만 불필요한 코드나 수정이 필요한 부분을

 

조금 바꿔서 풀어보았다.

 

 

코드

# 9020번

def Goldbach():
    check = [False, False] + [True] * 10000
    
    for i in range(2, 101):
        if check[i] == True:
            for j in range(i + i, 10001, i):
                check[j] = False

    T = int(input())
    for _ in range(T):
        n = int(input())

        A = n // 2
        B = A
        for _ in range(10000):
            if check[A] and check[B]:
                print(A, B)
                break
            A -= 1
            B += 1

Goldbach()

일단 입력값이 10000까지 주어질 수 있기 때문에 길이가 0, 1번 인덱스가 False이고 나머지가 True인

 

길이가 10002인 check라는 리스트를 만든다.

 

사실 이거보다 더 짧아도 되지 않을까 생각은 해봤는데 해보지는 않았다.

 

입력값이 10000까지 주어지기 때문에 101보다 작은 소수들의 배수들을 False로 바꿔주면

 

소수만 남는다.

 

 

백준 1929번 파이썬 풀이: 소수 구하기

백준 1929번 소수 구하기 알고리즘 분류: 수학, 정수론, 소수 판정, 에라토스테네스의 체 링크: https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어

yoonsang-it.tistory.com

자세한 내용은 앞서 풀었던 문제에 설명되있다.

 

이렇게해서 소수 리스트를 만들고나면

 

A와 B를 모두 입력값의 중간값으로 설정한다음 거기서부터 탐색을 해주는 것이다.

 

A와 B가 모두 소수가 아니라면 A를 1씩 줄이고 B를 1씩 늘려가면서 탐색한다.

 

A와 B가 모두 소수일 때만 True를 반환하기 때문에 둘 다 모두 True일 경우

 

A와 B를 출력해준다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함