문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
예제 입력
4 1 3 5 7
예제 출력
3
import sys
def is_prime(n):
if (n == 1):
return False
i = 2
while (i * i <= n):
if (n % i == 0):
return False
i += 1
return True
N = int(input())
num = list(map(int, sys.stdin.readline().split()))
cnt = 0
for _ in num:
if (is_prime(_)):
cnt += 1
print(cnt)
print(sum(all(i%j for j in range(2, i))*i>=2 for i in map(int,input().split())))
지난번에 풀었던 소수 구하기에서 작성한 is_prime
함수를 사용해서 문제를 풀었다.
좀 더 파이썬스럽게 사고하기 위해 참고한 숏코딩을 통해 내장함수 all
에 대해 배웠다.
all함수는
input()
print(sum(all(i%j for j in range(2, i))*i>=2 for i in map(int,input().split())))
이 두 줄이 코드의 전부였다. 우선 파이썬은 리스트를 받을 때 크기를 미리 할당해주지 않아도 되기 때문에 처음으로 들어오는 N은 input()으로 날려주었다. 소수 판별 코드에 대해 하나하나 뜯어보았는데 저렇게 푼 사람은 어떻게 생각해냈는지 진짜 똑똑한 것 같다.
for i in map(int, input().split())
을 통해 소수인지 아닌지 판별할 숫자 리스트를 받는다.all(i%j for j in range(2, i))
를 통해 리스트의 각 숫자가 자기 2부터 자기 자신보다 작은 수 까지의 숫자와 나누어 떨어지는지 확인한다. 나누어 떨어지는 수가 있다면 i%j의 값이 0으로 False가 되어 all연산의 값은 0이 된다.*i >= 2
를 해주어 1인 경우를 제거한다.all(i%j for j in range(2, i)) * i >= 2
가 True(==1)가 되는 경우만 sum()
에서 모두 더해지고 그 결과를 출력한다.print(sum(all(i%j for j in range(2, i)) and i >= 2 for i in map(int, input().split())))
으로 고치면 더 직관적일 것 같다.