본문 바로가기

알고리즘/백준

[Python] 백준 파이썬 1929 소수 구하기

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

두 자연수 사이의 소수를 구해서 각각 출력하는 문제입니다.

문제 자체는 간단했습니다.

m, n = map(int, input().split())
# m부터 n까지 정수들의 리스트를 만들어줌
num = list(range(m, n+1))
if 1 in num:
  num.remove(1) # 1은 소수가 아니니까 삭제
prime=[] # 소수들을 담을 리스트 하나 생성
for i in num:
  error = 0
  for j in range(2, i): # 리스트 안의 수 각각 2 ~ (본인-1) 까지 나눠줌
                        # 나누어 떨어지면 소수가 아니니까 error + 1 해줌
    if i % j == 0:
      error += 1
  # 에러가 0인 애들은 소수니까 prime리스트에 추가    
  if error == 0:
    prime.append(i)
# 한 줄씩 출력
for p_num in prime:
  print(p_num)

처음에 이렇게 했는데 시간 초과가 떴습니다.... ㅜ.ㅜ

그래서 찾아보니까 2 ~ 본인-1 수까지 나눠줄 때 자기 자신의 제곱근 까지만 확인 해주면 된다고 하더라구요? 그래서 코드를 수정하고 올려서 통과했습니다.

m, n = map(int, input().split())
for i in range(m,n+1):
  if i == 1:
    continue
  error = 0
  for j in range(2, int(i**0.5)+1): # 굳이 모든 수에 대해서 나눌필요 없음. 제곱근까지만 해도 됨
    if i % j == 0:
      error += 1
      break
  if error == 0:
    print(i)

쓸데없는 리스트 생성하고 뭐 지우고 하는 과정도 다 뺐습니다. 최대한 필요한 것만 써야할텐데... 아직 많이 부족합니다. ㅜ.ㅜ