[백준/파이썬] 2581. 소수

jwKim·2023년 1월 17일
0

💻코테코테

목록 보기
29/42

< 과제 >

[ 문제 ]
자연수 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())
N = int(input())

result = []

for num in range(M, N+1):
    if num == 1: # 1은 소수가 아님
        pass
    else:
        flag = 0 # 약수 존재 여부 플래그
        for j in range(2, num):
            if num % j == 0: # 약수가 하나라도 있다면 반복 중단
                flag += 1 # 약수가 존재한다는 의미
                break
        
        if flag == 0: # 약수가 없다면 결과 리스트에 저장
            result.append(num)
        
# 결과 리스트 길이에 따라 출력형태가 달라짐
if len(result) > 0:
    print(sum(result))
    print(result[0]) # 순서대로 반복했으므로 가장 작은 수는 첫 번째에 위치한 수
else:
    print(-1)
  • 입력받은 숫자만큼 반복문을 돈다. 반복하는 숫자가 1이라면 pass
  • 1과 자신을 제외한 약수가 존재하는지 여부를 플래그로 나타내기 위해 flag라는 변수를 0으로 초기화 한다.
  • 2부터 반복을 돌며 나누는데, 나누어 떨어지면 flag에 1을 더하고 반복을 끝낸다.(약수의 개수가 중요한 것이 아니라 약수가 존재한다는 것 자체가 중요하므로 플래그는 1로도 충분)
  • 플래그가 0인 수(약수가 없는 수)는 reuslt 리스트에 저장한다.

< 피드백 >

  • 앞서 최대 공약수, 최소 공배수 문제에서는 약수를 전부 리스트에 저장했다. 약수가 무엇인지 알기 위해서였는데, 이번 문제에서는 약수가 어떤 수인지, 개수는 몇 개인지 등의 정보는 필요 없고 단지 약수가 있다는 것 자체가 중요한 문제라서 플래그 형태로 변경했다.

< 출처 >

0개의 댓글