본문 바로가기

건승하고있어요/알고리즘

[소수] 소수찾기

반응형

문제: 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

(출처: https://www.acmicpc.net/problem/1978)


고등학교 때의 수학지식을 꺼내지 않을 수 없었다.

소수는 약수가 1과 자기 자신, 2개일 때 그 수를 소수라 했다. 그리고 1은 소수가 아니다. 약수가 자기 자신 1개니까. 라고 외움.ㅋㅋ


짧게 끝날 수 있었던 문제였는데 웬 1이 인식이 안 돼서 참 거지같은 코드가 되었다. 



for(int i=0 ; i<N ; i++) {
            if(YN == false) {
                YN = true;
            }
            for(int j=2 ; j<array[i] ; j++) {
                if(array[i]%j == 0) {
                    YN = false;
                } 
            }
            if(YN == true) {
                if(array[i] == 1) {
                    M--;
                }
                M++;
            }
        }
        


우선 scanner로 숫자를 다 받아서 배열에 넣는다. 그리고 그 숫자들을 하나씩 2부터 본인의 숫자 직전 숫자까지 나눠본다.


 if(array[i]%j == 0) {
                    YN = false;
                } 


그리고 만약에 나머지가 없으면 다 나뉘었다는 얘기이므로 약수가 자기 자신 말고도 존재한다는 얘기가 된다. 그 때는 앞서 선언해준 boolean을 false로 바꿔준다. 위에서 true가 초기화 값이므로..  근데 진짜 이상한게 원래 저 조건에 


 if(array[i]%j == 0 || array[i] == 1) {
                    YN = false;
                }

array[i] == 1 이것도 집어넣었는데, 아무리 해도 1은 인식이 안 되더라. 무조건 소수로 들어가길래 진짜 이상하다고 생각했다. 

else if로 따로 array[i] == 1 조건도 넣었는데 계속 1은 나몰라라 취급을 안해줬다. 왜일까ㅠ_ㅠ 그래서 바보같은 코드를 넣을 수 밖에 없었다.


--------------------------------------추가

ㅋㅋㅋ바보야! j가 2부터 돌아가니까 그렇지!!! 그러니까 아예 j포문에 들어오지를 않지 바보바보야

2<1인 경우는 없잖아!!!!!!!!!!!!!!!!!!!!!! 바보!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


 if(YN == true) {
                if(array[i] == 1) {
                    M--;
                }
                M++;
            }


위에서 false로 바뀌지 않은 경우엔  이 if문으로 들어온다. 그래서 M의 카운트를 하나씩 올려준다. 

근데 위에서 1이 false로 안 바뀌길래 여기서 1을 빼줬다. -.,- 이게 뭔짓이고ㅠ_ㅠ 그래도 다행스럽게 여기서는 먹혔다. 그래서 1이 빠졌다. 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 


이렇게 i포문이 한 바퀴 돌고나면 

if(YN == false) {
                YN = true;
            }


false가 된 boolean을 다시 true로 바꿔준다. 그리고 다시 j포문으로 고고!


이제 자야지. 내일 나가야하는데. 큰일이네


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
32
33
34
35
36
37
38
import java.util.Scanner;
 
public class PrimeNum {
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int array [] = new int[N];
        int M = 0;
        boolean YN = true;
        for(int i=0 ; i<N ; i++) {
            array[i] = scan.nextInt();
        }
        //약수가 1과 자기 자신일 때 소수
        for(int i=0 ; i<N ; i++) {
            if(YN == false) {
                YN = true;
            }
            for(int j=2 ; j<array[i] ; j++) {
                if(array[i]%j == 0) {
                    YN = false;
                } 
            }
            if(YN == true) {
                if(array[i] == 1) {
                    M--;
                }
                M++;
            }
        }
        
        System.out.println(M);
        
        scan.close();
    }
 
}
 
cs


반응형

'건승하고있어요 > 알고리즘' 카테고리의 다른 글

[if] 평균은 넘겠지 / printf() 메소드 정리  (2) 2018.02.11
[for] 2007년 달력문제  (0) 2018.02.08
[1차원배열] 숫자의 개수  (2) 2018.02.07
[if] X보다 작은 수  (2) 2018.02.07
[if] 평균구하기  (2) 2018.02.06