기록하지 않았다면 잃어버릴 시간들
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
블로그 내 검색

기록하지 않았다면 잃어버릴 시간들

새로운 것을 배우는게 즐거운 개발자입니다.

  • 알고리즘/백준

    BOJ 1644 소수의 연속합/ C++

    2022. 5. 23.

    by. 내이름은 킹햄찌

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

     

    1644번: 소수의 연속합

    첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

    www.acmicpc.net

    백준 온라인저지 1644번 소수의 연속합 문제입니다.

     

    아이디어

    n이하의 소수들을 합하여 n이 될 수 있는 모든 경우의 수를 찾는 문제입니다.

    n이하의 모든 소수를 에라토스테네스의 체를 이용하여 구해주고, 투포인터 알고리즘을 사용하여 크기 순서대로 놓여진 소수들을 앞에서 부터 더하여 크기가 n보다 작을경우는 다음 소수를 하나씩 더 더하고, n보다 클 경우는 가장 오래전에 더했던 소수들을 빼서 합이 n인 케이스를 모두 찾아냈습니다.

     

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    int n;
    vector<int> checkPrime;
    vector<int> prime;
    void input() {
    	cin >> n;
    	checkPrime.resize(n + 1,1);
    }
    
    //에라토스테네스의 체
    void findPrime(int num) {
    	for (int i = 2; i*i <= n; i++) {
    		if (checkPrime[i] == 0) continue;
    		for (int j = i + i; j <= n; j += i) {
    			checkPrime[j] = 0;
    		}
    	}
    	for (int i = 2; i <= n; i++) {
    		if (checkPrime[i]) 
    			prime.push_back(i);
    	}
    }
    
    void solution() {
    	findPrime(n);
    	int start = 0;
    	int end = 0;
    	int sum = 0;
    	int cnt = 0;
    	//투포인트
    	while (1) {
    		//n보다 작다면 startPoint 증가
    		if (sum > n) {
    			sum -= prime[start];
    			start++;
    			continue;
    		}
    		// n보다 크다면 endPoint 증가
    		if (sum < n) {
    			if (end >= prime.size()) break;
    			sum += prime[end];
    			end++;
    			continue;
    		}
    		//n과 같다면 카운팅
    		cnt++;
    		if (end >= prime.size()) break;
    		sum += prime[end];
    		end++;
    	}
    	cout << cnt;
    }
    
    int main(void) {
    	input();
    	solution();
    }

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ 14500 테트로미노 / C++  (0) 2022.05.23
    BOJ 2470 두 용액 / C++  (0) 2022.05.23
    BOJ 1311 할 일 정하기1 / C++  (0) 2022.05.23
    BOJ 17244 아맞다우산 / C++  (0) 2022.05.23
    BOJ 4991 로봇 청소기/ C++  (0) 2022.05.23

    댓글

    관련글

    • BOJ 14500 테트로미노 / C++ 2022.05.23
    • BOJ 2470 두 용액 / C++ 2022.05.23
    • BOJ 1311 할 일 정하기1 / C++ 2022.05.23
    • BOJ 17244 아맞다우산 / C++ 2022.05.23
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
내이름은 킹햄찌

티스토리툴바