새소식

알고리즘 테스트 ⏲/백준

[백준] 6588. 골드바흐의 추측 풀이 / Python, JavaScript

  • -
 

6588번: 골드바흐의 추측

각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰

www.acmicpc.net

 

작성 코드 (.py)

import sys
sys.stdin = open("input.txt", "r") # 제거
input = sys.stdin.readline

n = 1000001
# 소수 아닌 모든 홀수 처리
table = [1] * n
for i in range(3, int(n ** 0.5) + 1, 2):
    if table[i]:
        for j in range(i * 2, n, i):
            table[j] = 0
# k가 만들어지는 두 홀수인 소수 검색
while 1:
    k = int(input())
    if not k:
        break
    for i in range(3, int(k / 2) + 1, 2):
        if table[i] and table[k - i]:
            print(f"{k} = {i} + {k - i}")
            break
    else:
        print("Goldbach's conjecture is wrong.")

작성 코드 (.js)

function solution(numbers) {
  const n = 1000001;
  // 소수 아닌 모든 홀수 처리
  const table = Array(n).fill(1);
  for (let i = 3; i <= parseInt(n ** 0.5); i += 2) {
    if (table[i]) {
      for (let j = i * 2; j < n; j += i) table[j] = 0;
    }
  }
  const result = [];
  // k가 만들어지는 두 홀수인 소수 검색
  for (const k of numbers) {
    if (!k) break;
    let exist = false;
    for (let i = 3; i <= parseInt(k / 2); i += 2) {
      if (table[i] && table[k - i]) {
        result.push(`${k} = ${i} + ${k - i}`);
        exist = true;
        break;
      }
    }
    if (!exist) result.push("Goldbach's conjecture is wrong.");
  }
  return result;
}
console.log(solution([8, 20, 42, 0]));

 

구현 알고리즘 (에라토스테네스의 체)

이 문제의 핵심은 <4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다>라는 편지의 내용입니다. 이 부분을 효율적으로 구현하지 않았다면 100% 제한 시간에 걸릴겁니다. 에라토스테네스의 체를 구현할 때 모든 소수를 찾아줄 필요가 없습니다. 홀수의 합이라고 하였으니 홀수인 소수만 판별해준 테이블을 사용하면 되겠습니다.

 

입력값 k가 만들어지는 두 홀수인 소수를 검색하기 위해서는 가장 작은 소수인 3부터 2칸씩 건너뛰며 테이블에 현재 i값이 소수인지와 k - i값이 소수인지를 확인하면 됩니다. 검색 코드의 두번째 for문 역시 모든 수를 확인해줄 필요없이 k의 절반까지만 확인합니다. 문제의 조건에서는 만족하는 결과가 여러개일 경우 차가 가장 큰 것을 사용하라고 했지만 어차피 처음 발견되는 것이 가장 차가 큰 수들이므로 발견되면 즉시 i값과 k - i값을 결괏값에 입력해줍니다.

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.