본문 바로가기
공부/Algorithms w.Java

백준 1644; java

by thegreatjy 2021. 12. 6.
728x90

- 정답 코드

import java.io.*;
import java.util.*;

public class Main {

	static boolean prime[];
	static ArrayList<Integer> primes = new ArrayList<>();
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		int N=Integer.parseInt(bf.readLine());
		int result=0;
		int s=0, l=0, sum=0;
		//ArrayList<Integer> primes=new ArrayList<Integer>();

		prime = new boolean[N+1];        
        prime[0] = prime[1] = true;       
        for(int i=2; i*i<=N; i++){
            if(!prime[i]) for(int j=i*i; j<=N; j+=i) prime[j]=true;                
        }            
        for(int i=1; i<=N;i++){
        	if(!prime[i]) primes.add(i);     
        }

		Collections.reverse(primes);
		//System.out.println(primes);
		s=primes.size()-1; l=primes.size()-1;
		int i=l;
		while(i>=0){
			sum=sum+primes.get(i);
			//System.out.println(sum);
			if(sum > N) {
				sum=sum-primes.get(l)-primes.get(i);
				if(l-1<s) {//s==l
					l=i; s=i; 
				}else {
					l=l-1;
				}
				//System.out.println("sum >N] i="+i+" s="+s+" l="+l);
			}else if(sum == N){
				result++;
				//System.out.println("sum==N] i="+i+" s="+s+" l="+l);
				sum=sum-primes.get(l);
				s=i;
				l=l-1;
				i--;
			}else {	//sum < N
				s=i;
				i--;
			}
		}
		System.out.println(result);
	}

}

 

소수 구할 때, 그냥 간단하게 반복문으로 돌려서 prime 리스트에 넣었는데 이렇게 하면 시간 초과가 뜬다..

구글링으로 소수 구하는 부분만 따서 넣어줬더니 정답이 나왔다.

에라토스테네스의 체라는 방법이라고 한다.

 

++공부해서 추가할 것!++

728x90

'공부 > Algorithms w.Java' 카테고리의 다른 글

백준 2407; java  (0) 2021.12.11
백준 1167; java  (0) 2021.12.06
백준 17413; java  (1) 2021.11.29
프로그래머스 67256-키패드 누르기; java  (0) 2021.11.29
백준 10026; java  (0) 2021.10.04