예제 입력
4
1 3 5 7
예제 출력
3
해결 방법
소수는 1과 나 자신을 제외한 모든 수들로 나누어떨어지지 않는 수입니다.
이 사실을 바탕으로 코드를 작성합니다.
첫째 줄에 숫자의 개수가 주어지므로, 소수를 판별하는 과정을 n번 반복합니다.
소수임을 판단하는 isprime 변수를 1로 지정한 후, 2부터 (자기 자신 - 1)까지 나누어보는 for문을 반복합니다.
나누어떨어지는 경우가 생길 경우 그 수는 소수가 아닌 것이기에 isprime = 0으로 만들어 줍니다.
그리고 for 문이 끝난 후 isprime의 값을 검사하여 1일 경우 소수의 개수를 저장한 변수 cnt에 +1을 해 주는 방식으로
작동합니다.
그리고 isprime 변수는 다음 들어올 숫자를 위하여 1로 다시 지정해줍니다.
코드
#include <stdio.h>
int main(){
int n, cnt = 0, isprime, input;
scanf("%d", &n);
for (int i = 0; i < n; i++){
isprime = 1;
scanf("%d", &input);
if (input == 1) isprime = 0;
for (int j = 2; j < input; j++){
if (input % j == 0) isprime = 0;
} // 소수의 정의 이용
if (isprime == 1) cnt++;
}
printf("%d", cnt);
}
입력된 숫자가 1일 때를 따로 작성한 이유는, 소수의 정의를 이용한 반복문으로는 1이 소수인지 아닌지 판별할 수 없기 때문입니다.
그리고 숫자 여러개가 들어왔음에도 배열을 사용하지 않은 것은 scanf의 특성(버퍼) 덕분인데,
잘 설명된 글이 있으니 링크를 참고하시면 좋을 것 같습니다.
https://bigpel66.oopy.io/library/c/chewing-c/6
scanf 동작 방식
1. 들어가기 전에
bigpel66.oopy.io
'코딩 > 백준' 카테고리의 다른 글
[백준][C] 2581. 소수 (0) | 2022.10.04 |
---|---|
[백준][C] 2839. 설탕 배달 (0) | 2022.10.04 |
[백준][C] 2869. 달팽이는 올라가고 싶다. (0) | 2022.10.03 |
[백준][C] 1712. 손익분기점 (0) | 2022.10.03 |
[백준][C] 2941. 크로아티아 알파벳 (1) | 2022.10.03 |