백준 2581번 : 소수 [Java]

문제출처 

www.acmicpc.net/problem/2581

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

 

import java.util.Scanner;
public class d018_Q2581 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt();
		int N = sc.nextInt();
		
		int[] prime = find_prime(M, N);
		int min = prime[0];
		int sum = sum(prime);
		
		if(min == 0) {
			System.out.println("-1");
		}
		else {
			System.out.println(sum);
			System.out.println(min);
		}
		
		sc.close();
	}
	
	public static boolean check(int n) {
		int i = 2;
		while(i < n) {
			if(n % i++ == 0) {
				return false;
			}
		}
		return true;
	}
	
	public static int[] find_prime(int m, int n) {
		int[] p = new int[n - m + 1];
		int index = 0;
		
		while(m <= n) {
			if(check(m)) {
				p[index++] = m;
			}
			m++;
		}
		
		return p;
	}
	
	public static int sum(int[] a) {
		int sum = 0;
		for(int i = 0; i < a.length; i++) {
			sum += a[i];
		}
		return sum;
	}

}

 

틀렸다.

내가 대충 생각해본 반례들을 대입해보니 틀렸다,

 

범위에 1이 포함되는 경우 check에서 1을 거르는 문장이 없어서 true가 반환됐다.

어제 문제 풀때 쓴 함수를 그대로 끌어왔는데

그건 메인에서 1을 거른 후에 저 함수를 사용했어서 문제점을 몰랐는데 저런 문제점이 있더라

 

 

import java.util.Scanner;
public class d018_Q2581 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt();
		int N = sc.nextInt();
		
		int[] prime = find_prime(M, N);
		int min = prime[0];
		int sum = sum(prime);
		
		if(min == 0) {
			System.out.println("-1");
		}
		else {
			System.out.println(sum);
			System.out.println(min);
		}
		
		sc.close();
	}
	
	public static boolean check(int n) {
		int i = 2;
		if(n == 0 || n == 1) {return false;}
		while(i < n) {
			if(n % i++ == 0) {
				return false;
			}
		}
		return true;
	}
	
	public static int[] find_prime(int m, int n) {
		int[] p = new int[n - m + 1];
		int index = 0;
		
		while(m <= n) {
			if(check(m)) {
				p[index++] = m;
			}
			m++;
		}
		
		return p;
	}
	
	public static int sum(int[] a) {
		int sum = 0;
		for(int i = 0; i < a.length; i++) {
			sum += a[i];
		}
		return sum;
	}

}

 

check에 조건을 추가 해줬다.

n == 0인 경우가 채점시에 있는지는 모르겠지만 0도 저기서 거르지 않으면 find_prime에서 p[0]에 0이 들어가버릴 수도 있어서 그럼 메인에서 -1출력하는 문장에 걸려버리게 된다.

myoskin