1. 링크
https://www.acmicpc.net/problem/1929
2. 문제 설명
1) 문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
2) 입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
3) 출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
3. 코드
#1929
import math
#소수 판별 함수 정의
def Is_prime(n):
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0: return False
return True
#입력 받기
M, N = map(int, input().split(' '))
primes = []
#소수일 경우 primes에 추가
for i in range(M, N+1):
if Is_prime(i) and i!=1:
primes.append(i)
#결과 출력하기
for n in primes: print(n)
4. 설명
자주 나오는 문제 유형인 소수 판별이다. 관련 개념이 부족해 문제를 풀기 위해 다음 블로그를 다수 참고하였고, 때문에 코드도 매우 유사하다..
특정 자연수가 소수인지 확인하기 위해선 제곱근까지만 (가운데 약수까지만) 확인하면 충분하다. 이는 가운데 약수를 기준으로 약수와 약수를 곱해 자연수를 구하는 등식이 대칭적이기 때문이다. 이를 통해 연산 횟수를 줄일 수 있고, 나 또한 이 방법을 사용하였다.
우선 소수 판별 함수를 정의하고, 입력을 받은 후 입력 범위 사이의 자연수들에 대해 소수일 경우 primes 리스트에 append하였다. 그 후 결과를 출력하면 된다.
시간복잡도는 O(N)이다.
5. 배운 점
우선 소수 판별 알고리즘에 대해 잘 정리된 블로그글을 찾아 확실하게 개념을 잡았고, 이후 다른 문제는 자력으로 풀 수 있을 것 같다. 또한 처음 코드에서는 1을 제외하는 처리를 하지 않아 틀렸는데, 이런 류의 문제를 풀 때 1은 소수가 아니라는 점을 확실히 해야 한다고 다짐했다.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 9012] 괄호 (0) | 2023.04.30 |
---|---|
[백준 10845, 10828, 10866] 큐, 스택, 덱 (0) | 2023.04.24 |
[백준 1436] 영화감독 숌 (0) | 2023.04.08 |
[백준 11650] 좌표 정렬하기 (0) | 2023.04.02 |
[백준 11659] 구간 합 구하기 4 (0) | 2023.03.31 |