하루한줄 코딩일기
[인프런 - 파이썬 알고리즘 문제풀이] 2.7 소수(에라토스테네스 체) 본문
섹션 2.7 소수(에라토스테네스 체)
👊 내 문제 풀이
가장 원초적으로 풀어봤다. 숫자 i를 2 이상, i 미만의 수로 나눠 나머지가 0인 경우가 나오지 않을 경우, i는 소수라고 판단한다. 소수라고 판단하기 위해선 전체 경우의 수를 탐색해야 하기 때문에 시간 복잡도가 구린 코드다.
n=int(input())
sosu = [2]
is_sosu=False
for i in range(3,n): #2는 소수, 3부터 소수 검사
for j in range(2,i):
if i%j==0:
is_sosu=False
break
else:
is_sosu=True
if is_sosu == True:
sosu.append(i)
print(len(sosu))
채점 결과
역시 시간 초과로 실패했다. 제목의 '에라토스테네스의 체'를 이용해서 다시 풀어보도록 하자.
에라토스테네스의 체는 합성수를 지워가며 소수를 찾는 알고리즘이다.
먼저 1은 제거하고, 순서대로 소수를 찾으며 그 소수의 배수는 모두 제거한다.
소수 2를 찾은 후 2의 배수는 모두 지우고, 다음 소수 3을 찾은 후 3의 배수를 모두 제거한다.
이 과정을 반복해가며 범위 내의 소수를 찾는다.
강의 해설 일부를 먼저 보고 참고해서 코드를 작성했다.
먼저 n+1 크기의 리스트를 True로 초기화해주고, 그 중 0과 1은 False로 제외시켰다.
2부터 n까지 반복문을 돌며 해당 인덱스가 True일 경우, 소수라고 판단하여 cnt에 +1을 해준다.
다음 그 소수의 배수들을 전부 찾아 False로 제외시킨다. 이 과정을 반복하면 마지막에는 소수만 남게 된다.
n=int(input())
numList=[True]*(n+1)
numList[0]=False #0,1은 제외
numList[1]=False
cnt=0
for i in range(2, n+1):
if numList[i] == True: #True면 소수
cnt+=1
for j in range(i+i, n+1, i): #소수 i의 배수들은 모두 제외(False)
numList[j] = False;
print(cnt)
채점 결과
💡 강의 해답
n=int(input())
ch=[0]*(n+1)
cnt=0
for i in range(2, n+1):
if ch[i]==0:
cnt+=1
for j in range(i, n+1, i):
ch[j]=1
print(cnt)
'Algorithm' 카테고리의 다른 글
[프로그래머스] 음양 더하기(LV.1) - 파이썬(Python) (0) | 2022.02.01 |
---|---|
[백준] 소수 구하기(1929번) - 파이썬(Python) (0) | 2022.01.30 |
[인프런 - 파이썬 알고리즘 문제풀이] 2.6 자릿수의 합 (0) | 2022.01.26 |
[백준] 5단계: 1차원 배열(1~7번) - 파이썬(Python) (0) | 2022.01.25 |
[백준] 4단계: while문(1~3번) - 파이썬(Python) (0) | 2022.01.25 |
Comments