[오늘의 백준]1978.소수찾기

한지원·2021년 6월 3일
0

문제
주어진 수 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()으로 날려주었다. 소수 판별 코드에 대해 하나하나 뜯어보았는데 저렇게 푼 사람은 어떻게 생각해냈는지 진짜 똑똑한 것 같다.

  1. for i in map(int, input().split())을 통해 소수인지 아닌지 판별할 숫자 리스트를 받는다.
  2. all(i%j for j in range(2, i))를 통해 리스트의 각 숫자가 자기 2부터 자기 자신보다 작은 수 까지의 숫자와 나누어 떨어지는지 확인한다. 나누어 떨어지는 수가 있다면 i%j의 값이 0으로 False가 되어 all연산의 값은 0이 된다.
  3. 이 때 i의 값이 1이라면 소수가 아니지만 all연산에서 True가 나오기 때문에 *i >= 2를 해주어 1인 경우를 제거한다.
  4. 이로서 각각의 숫자에 대해 2부터 자기 자신보다 1만큼 작은 수 중에 자기 자신과 나누어 떨어지는 수가 없고, 자기 자신이 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())))으로 고치면 더 직관적일 것 같다.

0개의 댓글