문제 설명
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
제한 조건
- n은 2이상 1000000이하의 자연수입니다.
입출력 예
n | result |
10 | 4 |
5 | 3 |
입출력 예 설명
입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환
나의 풀이
[Python(파이썬)]
- 첫번째 코드 - 시간초과, 효율성이 없음
def solution(n):
num = 1
for i in range(3, n+1):
tf = True
for j in range(2,i):
if i % j == 0:
tf = False
break
if tf == True:
num += 1
return num
- 두번째 코드 - 에라토스테네스의 정리 사용한 코드
def solution(n):
arr = [True] * (n+1)
for i in range(2, int(n**0.5)+1):
for j in range(2*i, n+1, i):
arr[j] = False
return arr.count(True)-2
# -2는 arr[0],arr[1]을 빼주기 위해서
학습한 내용
- 에리토스테네스의 정리
[Python] 에라토스테네스의 체
에라토스테네스의 체는 수학에서 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견했다. 소수란? 약수가 1과 자기 자신만을 가지는 정수 2부터 구하고자 하는 구간의 모든 숫자
young-library.tistory.com
- 이번에는 첫번째 코드가 효율성이 좋지 않아서 다른 코드들 참조하면서 문제 풀이했다ㅠㅠ
- 첫번째 for문 범위 (2 ~ n)
def solution(n):
arr = [True] * (n+1)
for i in range(2, n+1):
for j in range(2*i, n+1, i):
arr[j] = False
return arr.count(True)-2
# -2는 arr[0],arr[1]을 빼주기 위해서
- 첫번째 for문 범위 (2 ~ int(n**0.5)) -> 제곱근 까지
def solution(n):
arr = [True] * (n+1)
for i in range(2, int(n**0.5)+1): # 2부터 제곱근까지
for j in range(2*i, n+1, i):
arr[j] = False
return arr.count(True)-2
# -2는 arr[0],arr[1]을 빼주기 위해서
에라토스테네스의 체를 사용하여 소수인지 확인할 때 n을 2부터 제곱근까지 구하면 더 빠르게 구할 수 있다.
문제 출처
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
'[Python] Programmers > Level1' 카테고리의 다른 글
[프로그래머스/Level1] 문자열을 정수로 바꾸기 (0) | 2021.06.21 |
---|---|
[프로그래머스/Level1] 수박수박수박수박수박수? (0) | 2021.06.21 |
[프로그래머스/Level1] 서울에서 김서방 찾기 (0) | 2021.06.18 |
[프로그래머스/Level1] 문자열 내 마음대로 정렬하기 (0) | 2021.06.17 |
[프로그래머스/Level1] 나누어 떨어지는 숫자 배열 (0) | 2021.06.17 |
댓글