문제 링크
https://www.acmicpc.net/problem/2581
문제
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라
이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중
소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로,
이들 소수의 합은 620이고, 최솟값은 61이 된다.
입력
입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.
출력
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을,
둘째 줄에 그 중 최솟값을 출력한다.
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
예제
입력
60
100
출력
620
61
입력
64
65
출력
-1
정답 및 풀이
m = int(input())
n = int(input())
cnt=0
arr=[]
for i in range(m,n+1):
if i > 1 :
for j in range(2, int(i**0.5)+1):
if i % j == 0 :
break
else:
arr.append(i)
cnt += i
if len(arr) <= 0 :
print(-1)
else:
print(cnt)
print(min(arr))
- m = int(input())
- 첫 번째 줄에서 시작값 m을 입력받아 정수로 변환합니다.
- n = int(input())
- 두 번째 줄에서 끝값 n을 입력받아 정수로 변환합니다.
- cnt = 0
- 소수들의 합을 저장할 변수를 0으로 초기화합니다.
- arr = []
- 소수들을 저장할 리스트를 초기화합니다.
- for i in range(m, n + 1):
- m부터 n까지 모든 정수 i를 하나씩 검사합니다.
- if i > 1:
- 1은 소수가 아니므로, 1보다 큰 수만 검사합니다.
- for j in range(2, int(i ** 0.5) + 1):
- i가 소수인지 판별하기 위해 2부터 √i까지만 나누어 봅니다.
- 제곱근까지만 확인해도 효율적으로 소수를 판별할 수 있습니다.
- if i % j == 0:
- i가 j로 나누어 떨어진다면 i는 소수가 아닙니다.
- break
- 약수가 발견되면 더 이상 검사할 필요가 없으므로 반복을 종료합니다.
- else:
- for문이 break 없이 끝났다면 i는 소수이므로 else문 실행됩니다.
- arr.append(i)
- 소수로 판별된 i를 리스트에 추가합니다.
- cnt += i
- 소수의 합을 구하기 위해 cnt에 더합니다.
- if len(arr) <= 0:
- 소수 리스트가 비어 있다면 (소수를 한 개도 찾지 못했다면) 참이 됩니다.
- print(-1)
- 소수가 없을 경우 문제 조건에 따라 1을 출력합니다.
- else:
- 소수가 하나라도 존재할 경우 실행됩니다.
- print(cnt)
- 찾은 모든 소수의 합을 출력합니다.
- print(min(arr))
- 찾은 소수들 중 가장 작은 소수를 출력합니다.
'백준' 카테고리의 다른 글
| [백준] 1085 : 직사각형에서 탈출 (Python/파이썬) (0) | 2025.10.16 |
|---|---|
| [백준] 11653 : 소인수분해 (Python/파이썬) (0) | 2025.10.14 |
| [백준] 1978 : 소수 찾기 (Python/파이썬) (0) | 2025.10.14 |
| [백준] 9506 : 약수들의 합 (Python/파이썬) (0) | 2025.10.14 |
| [백준] 2501 : 약수 구하기 (Python/파이썬) (0) | 2025.10.14 |