[Problem Solving/Java] 백준 9020번 - 골드바흐의 추측

2024. 1. 22. 14:22·알고리즘 문제 풀이 (Problem Solving)

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이 주어진다.

출력

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

첫 번째 시도

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int a = Integer.parseInt(br.readLine());
        String[] result = new String[a];
        for (int i = 0; i < a; i++) {
            int num = Integer.parseInt(br.readLine());
            boolean[] decimal = new boolean[num + 1];
            for (int j = 0; j < num + 1; j++) {
                decimal[j] = false;
            }
            decimal[0] = true;
            decimal[1] = true;
            for (int j = 2; j < num + 1; j++) {
                for (int k = 2; j * k < num + 1; k++) {
                    decimal[j * k] = true;
                }
            }
            for (int j = 0; j < num / 2; j++) {
                if (!decimal[num / 2 - j] && !decimal[num / 2 + j]) {
                    result[i] = (num / 2 - j) + " " + (num / 2 + j);
                    break;
                }
            }
        }
        for (String s : result) {
            System.out.println(s);
        }
    }
}

해결 방법

일주일 전에 했을 때는 시간초과로 오답이었다. 그 때는 먼저 주어진 수 n 이하의 수들을 에라토스테네스의 체 알고리즘으로 소수인 경우만 false로 남긴 Boolean 배열을 사용해여 각 소수의 쌍들을 덧셈을 통해 하나하나 확인하고, 합이 주어진 수 n과 같아지면 각각의 수가 같으면 출력하거나, 차이가 작은 수를 출력했다. Eclipse에서는 작동하지만, 홈페이지에서는 작동하지 않았다. 

오늘 다시 작성한 코드는 주어진 수 n 이하의 수를 에라토스테네스 알고리즘으로 소수만 추려내는 배열까지는 동일하다. N을 두 소수로 나누는 과정은 n을 2로 나누고 for문을 통해 i를 뺀 수와 i를 더한 수를 0부터 반복한다. 이를 통해 n/2 부터 1까지 가는 수와 n/2부터 n까지 가는 수가 나온다. 이 수가 소수인 배열을 참조해 소수이면 결과로 출력할 배열에 저장하고 break를 통해 빠져나온다.

 

반응형

'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글

[Problem Solving/Java] 백준 10989번 - 수 정렬하기 3  (0) 2024.04.15
[Problem Solving/Java] 백준 2751번 - 수 정렬하기 2  (1) 2024.01.22
[Problem Solving/Java] 백준 10250번 - ACM 호텔  (1) 2024.01.09
[Problem Solving/Java] 백준 1436번 - 영화감독 숌  (0) 2024.01.09
[Problem Solving/Java] 백준 7568번 - 덩치  (0) 2024.01.08
'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글
  • [Problem Solving/Java] 백준 10989번 - 수 정렬하기 3
  • [Problem Solving/Java] 백준 2751번 - 수 정렬하기 2
  • [Problem Solving/Java] 백준 10250번 - ACM 호텔
  • [Problem Solving/Java] 백준 1436번 - 영화감독 숌
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (187) N
      • 개발 (Development) (123) N
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (6)
        • Git (3)
        • Java (21) N
        • JavaScript (4)
        • Kafka (4)
        • Kubernetes (4) N
        • Linux (6)
        • PostgreSQL (33)
        • Python (17)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (6)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Linux master
    PostgreSQL
    리눅스 마스터 2급
    JSON
    ADsP
    deepseek
    Kubernetes
    DevOps
    Kafka
    백준온라인저지
    docker
    typescript
    백준자바
    리눅스 마스터
    pandas
    javascript
    python
    백준알고리즘
    Vue
    Vue.js
    springboot
    MyBatis
    AWS
    java
    데이터분석
    자바
    Linux
    리눅스 마스터 2급 2차
    백준
    오답노트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Problem Solving/Java] 백준 9020번 - 골드바흐의 추측
상단으로

티스토리툴바