문제: 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
(출처: https://www.acmicpc.net/problem/1978)
고등학교 때의 수학지식을 꺼내지 않을 수 없었다.
소수는 약수가 1과 자기 자신, 2개일 때 그 수를 소수라 했다. 그리고 1은 소수가 아니다. 약수가 자기 자신 1개니까. 라고 외움.ㅋㅋ
짧게 끝날 수 있었던 문제였는데 웬 1이 인식이 안 돼서 참 거지같은 코드가 되었다.
우선 scanner로 숫자를 다 받아서 배열에 넣는다. 그리고 그 숫자들을 하나씩 2부터 본인의 숫자 직전 숫자까지 나눠본다.
그리고 만약에 나머지가 없으면 다 나뉘었다는 얘기이므로 약수가 자기 자신 말고도 존재한다는 얘기가 된다. 그 때는 앞서 선언해준 boolean을 false로 바꿔준다. 위에서 true가 초기화 값이므로.. 근데 진짜 이상한게 원래 저 조건에
array[i] == 1 이것도 집어넣었는데, 아무리 해도 1은 인식이 안 되더라. 무조건 소수로 들어가길래 진짜 이상하다고 생각했다.
else if로 따로 array[i] == 1 조건도 넣었는데 계속 1은 나몰라라 취급을 안해줬다. 왜일까ㅠ_ㅠ 그래서 바보같은 코드를 넣을 수 밖에 없었다.
--------------------------------------추가
ㅋㅋㅋ바보야! j가 2부터 돌아가니까 그렇지!!! 그러니까 아예 j포문에 들어오지를 않지 바보바보야
2<1인 경우는 없잖아!!!!!!!!!!!!!!!!!!!!!! 바보!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
위에서 false로 바뀌지 않은 경우엔 이 if문으로 들어온다. 그래서 M의 카운트를 하나씩 올려준다.
근데 위에서 1이 false로 안 바뀌길래 여기서 1을 빼줬다. -.,- 이게 뭔짓이고ㅠ_ㅠ 그래도 다행스럽게 여기서는 먹혔다. 그래서 1이 빠졌다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이렇게 i포문이 한 바퀴 돌고나면
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 |