[Python]백준_2581 : 소수

Alal11·2022년 11월 6일
0
post-thumbnail

출처

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을 출력한다.


예제 입출력


알고리즘 분류

  • 수학
  • 정수론
  • 소수 판정

➡️문제 분석

소수는 1과 자기 자신만을 약수로 가지는 수이다.
즉, n을 2부터 n-1까지 수로 나눴을 때 나누어 떨어지는 수가 없다면 n은 소수가 되는 것을 이용한다.


➡️코드(⭕)

m = int(input())
n = int(input())
sosu_list = []

for i in range(m, n+1):             # m부터 n까지 반복
    num = 0
    for j in range(2, i):           # 2부터 i - 1까지 반복
        if i % j == 0:              # i % j가 0이라면
            num += 1                # num에 +1 해줌
            break
    if num == 0:                    # num이 0이라면
        sosu_list.append(i)         # 소수 리스트에 i 추가함

if 1 in sosu_list:                  # 소수 리스트에 1이 있으면
    sosu_list.remove(1)             # 1을 제거 해줌

if len(sosu_list) == 0:             # 소수 리스트에 아무것도 없으면
    print(-1)                       # -1을 출력
else:
    print(sum(sosu_list))
    print(sosu_list[0])

➡️코드 분석

  1. 범위 m과 n을 입력하고 소수를 담을 빈 리스트를 만든다.

  2. i를 m부터 n까지 반복해주는데, i가 소수인지 알기 위해서 j를 2부터 i-1까지 반복 해준다.

  3. 만약, i%j가 0이라면 i는 소수가 아니므로, num에 +1을 해주고 반복문을 빠져나온다.

  4. num이 그대로 0이라면 i는 소수이므로, 소수 리스트에 넣어준다.

  5. 소수 리스트에 1이 있으면 1을 제거해주고, 리스트가 비었으면 -1을 출력해준다.

  6. 첫째 줄에 소수 리스트의 합을 출력하고, 둘째 줄에 소수 리스트의 최솟값을 출력해준다.


➡️end

num이 1인지 0인지에 따라 소수인지 아닌지 판단할 수 있는 아이디어가 되게 좋은 것 같다!

0개의 댓글