티스토리 뷰

728x90
반응형

문제

 

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의 골드바흐 파티션을 출력한다. 

출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.

 

풀이

 

물론 더 빠른 길이 있지만 스트림을 쓰고 싶어서 고집을 좀 부려봤다.

 

먼저 테스트케이스를 담을 list와 결괏값을 담을 result를 만들고,

 

2부터 시작해서 list의 최댓값까지 소수를 판별해 담은 primeList를 만들어 두었다.

 

계속해서 list의 인덱스를 반복해 돌면서

 

  1. primeList로 스트림을 열어 해당 인덱스 list 값의 절반까지만 순회하며
  2. 해당 소수와 list값에서 해당 소수를 뺀 값이 둘 다 그 안에 들어있는 수를 필터링하고
  3. 그중 최대값(두 소수의 차가 가장 작은 것을 출력해야 하므로)을 골라 새로 만든 리스트 result에 넣어주었다.

이후엔 조건에 맞게 출력.

 

이래도 되나... 싶었지만 되길래 넘어가기로 했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Prob9020 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());

        List<Integer> list = new ArrayList<>();
        List<List<Integer>> result = new ArrayList<>();

        for (int i = 0; i < t; i++) {
            list.add(Integer.parseInt(br.readLine()));
        }

        List<Integer> primeList = IntStream.rangeClosed(2, Collections.max(list))
                .filter(a ->
                        IntStream.rangeClosed(2, (int) Math.sqrt(a))
                                .allMatch(b -> a % b != 0))
                .boxed()
                .collect(Collectors.toList());

        for (int i = 0; i < t; i++) {
            
            int finalI = i;

            int max = primeList.stream()
                    .filter(a -> a <= list.get(finalI) / 2)
                    .filter(a -> primeList.contains(list.get(finalI) - a))
                    .mapToInt(Integer::intValue)
                    .max()
                    .getAsInt();

            result.add(List.of(max, list.get(i) - max));
        }

        for (int i = 0; i < t; i++) {
            System.out.println(result.get(i).get(0) + " " + result.get(i).get(1));
        }
    }
}
반응형

'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글

[BackJoon]2563번  (3) 2022.12.26
[BackJoon]2566번  (6) 2022.12.25
[BackJoon]2738번  (0) 2022.12.25
[BackJoon]4948번 베르트랑 공준 스트림으로 풀기  (2) 2022.12.24
[BackJoon]1929번 스트림으로 풀기  (1) 2022.12.23
[BackJoon]11653번  (3) 2022.12.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함