b1644 소수의 연속합

2024. 11. 8. 17:02·Algorithm & Data Structures/BOJ

https://www.acmicpc.net/problem/1644

 

 

 

주어진 자연수 N을 소수의 연속된 합으로 나타내는 경우의 수를 구하는 문제다.

 

먼저, getArr 메서드를 통해 2부터 N까지의 소수들을 구한다.

이 과정에서 에라토스테네스의 체를 사용하여 소수를 빠르게 판별한다.

 

isPrime 배열을 초기화하고, 2부터 시작해 소수의 배수를 모두 제거해가며

소수 여부를 판별하여, primes 리스트에 소수들만 저장한다.

이후 리스트를 배열로 변환해 반환하여 효율적으로 소수 리스트를 사용할 수 있게 한다.

main 메서드에서는 먼저 N의 값을 입력받고,

getArr를 통해 구한 소수 배열 arr을 활용해 문제를 풀어간다.

 

start와 end 포인터를 통해 배열 내 소수의 연속합을 확인하며,

합이 N과 같을 경우 경우의 수 answer를 1 증가시킨다.

 

만약 합이 N보다 크다면, 해당 구간을 종료하고 다음 시작 인덱스로 넘어간다.

각 start 인덱스에 대해 새로운 연속합을 구하고,

조건에 맞는 구간을 찾는 식으로 반복한다.

 

최종적으로 구해진 경우의 수 answer를 출력하여 N을 소수의 연속된 합으로 나타내는

모든 경우의 수를 계산한다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class b1644 {

    private static int[] getArr(int N){
        boolean[] isPrime = new boolean[N + 1];
        List<Integer> primes = new ArrayList<>();

        for (int i = 2; i <= N; i++) {
            isPrime[i] = true;
        }

        for (int i = 2; i * i <= N; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= N; j += i) {
                    isPrime[j] = false;
                }
            }
        }

        for (int i = 2; i <= N; i++) {
            if (isPrime[i]) {
                primes.add(i);
            }
        }

        return primes.stream().mapToInt(Integer::intValue).toArray();
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = getArr(N);
        int size = arr.length, sum = 0, answer = 0;

        for(int start = 0 ; start < size ; start++){
            sum = arr[start];
            if(sum == N){
                answer++;
                continue;
            }
            for(int end = start + 1 ; end < size ; end++){
                sum+=arr[end];
                if(sum > N) break;
                if(sum == N){
                    answer ++;
                    break;
                }

            }
        }
        System.out.println(answer);
    }
}

'Algorithm & Data Structures > BOJ' 카테고리의 다른 글

b1766. 문제집  (1) 2024.11.14
b1647. 도시 분할 계획  (0) 2024.11.12
b1509. 펠린드롬 분할  (0) 2024.11.06
b1202. 보석도둑  (0) 2024.11.04
b1197. 최소 스패닝 트리  (0) 2024.10.31
'Algorithm & Data Structures/BOJ' 카테고리의 다른 글
  • b1766. 문제집
  • b1647. 도시 분할 계획
  • b1509. 펠린드롬 분할
  • b1202. 보석도둑
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (320) N
      • Algorithm & Data Structures (242) N
        • BOJ (100) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    유니온파인드
    Dijkstra
    전위순회
    BFS
    binarySearch
    Stack
    Java
    unionfind
    경로압축
    투포인터
    다익스트라
    Union-Find
    프로그래머스
    baekjoon
    스택
    dp
    이분탐색
    algorithm
    DynamicProgramming
    dfs
    구현
    PriorityQueue
    동적계획법
    골드
    백트래킹
    백준
    programmers
    SQL
    후위순회
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
b1644 소수의 연속합
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.