본문 바로가기
코딩테스트/백준

백준 > 단계별로 풀어보기 > 약수, 배수와 소수 > 2581번: 소수

by 나는야석사 2024. 7. 23.

문제

자연수 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 복사

60
100

예제 출력 1 복사

620
61

예제 입력 2 복사

64
65

예제 출력 2 복사

-1

 

M = int(input())    # M 이상
N = int(input())    # N 이하

cnt = 0
lst_2 = []
for i in range(M, N+1):
    lst = []
    for j in range(1, i+1):
        if i % j == 0:
            lst.append(j)
    if len(lst) == 2:
        cnt += 1
        for k in lst:
            lst_2.append(i)

if len(lst_2) == 0:
    print(-1)
else:
    lst_remove = set(lst_2)
    list = list(lst_remove)
    # print('list: ', sorted(list))
    print(sum(list))
    # print(lst_2)
    print(lst_2[0])

시간 초과...흠

M = int(input())    # M 이상
N = int(input())    # N 이하

cnt = 0
lst_2 = []
for i in range(M, N+1):
    lst = []
    for j in range(1, i+1):
        if i % j == 0:
            lst.append(j)
    if len(lst) == 2:
        cnt += 1
        lst_2.append(i)

if len(lst_2) == 0:
    print(-1)
else:
    lst_remove = set(lst_2)
    list = list(lst_remove)
    print(sum(list))
    print(lst_2[0])

세 번째 for문을 지우고, 한 수에 대해서 두 번째 for문이 끝나고 cnt가 증가될 때가 소수일 경우이니 그 때만 리스트에 수를 추가하는 방법으로 바꿨다.

 

m=int(input())
n=int(input())
li=[]
for i in range(m,n+1):
    e=0
    if i>1:
        for j in range(2,i):
            if i%j==0:
                e+=1
                break
        if e==0:
            li.append(i)

if len(li)<1:
    print(-1)
else:
    print(sum(li))
    print(min(li))

근데 이렇게 풀 수 있다고 한다..

시간이 1/8이다... 내가 쓴 코드는 별로다

 

그래서 이걸 토대로 다시 풀어봤다.

M = int(input())
N = int(input())

lst = []

for i in range(M, N+1):
    for j in range(2, i+1):
        if i % j == 0:
            if i == j:
                lst.append(i)
            break

if len(lst) == 0:
    print(-1)
else:
    print(sum(lst))
    print(lst[0])

걸리는 시간이 가장 짧다.

break는 i와 j가 같지 않을 경우 바로 for문을 멈추고 다음 숫자로 넘어간다.

break를 넣지 않으면 모든 수가 다 리스트에 추가되기 때문에 주의해야 한다.