본문 바로가기

알고리즘_파이썬

백준 2581 소수

https://www.acmicpc.net/problem/2581

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

문제 접근

M과 N의 범위가 그닥 크지 않아 원래 소수를 구하는 방법(2부터 해당 수 까지 나누어서 소수인지 판별)도 좋은 접근 법이다. 하지만 처음에는 1부터 N까지의 수에서 각 소수의 곱을 통해서 소수인지 아닌지를 판별한 후 소수인 수만 해당 범위에 따로 뽑아 정답을 구할 생각이었다. 이를 통해 시간 복잡도가 많이 줄어들거라 생각했으나 알고리즘이 머리속에서 구현이 덜 되어 시간초과가 발생했다.

M = int(input())
N = int(input())
numbers = [0]*(N+1)
for i in range(2,(N+1)):
  if i == index:
    pass
  for j in range(i,(N+1)):
    index = i*j
    if index < len(numbers):
      numbers[index] = 1

decimal = []
for num in range(M,N+1):
  if numbers[num] == 0:
    decimal.append(num)
if decimal:
  print(sum(decimal))
  print(min(decimal))
else:
  print(-1)

이를 통해 그냥 원래 정석대로 문제를 다시 풀었다. index를 1로 채우는 로직은 다음에 다시 시도하여 풀도록 하겠다. 

문제 풀이

M = int(input())
N = int(input())
decimals = []
for i in range(M,N+1):
  if i == 1:
    pass
  elif i == 2:
    decimals.append(i)
  else:
    for j in range(2,i):
      if i%j == 0:
        break
      elif j == i-1:
        decimals.append(i)
if decimals:
  print(sum(decimals))
  print(min(decimals))
else:
  print(-1)

'알고리즘_파이썬' 카테고리의 다른 글

백준 1157 단어 공부  (0) 2024.02.01
백준 11653 소인수 분해  (0) 2024.02.01
백준 5073 삼각형과 세변  (0) 2024.01.31
백준 9655 돌 게임  (0) 2024.01.31
백준 2749 피보나치 수3  (1) 2024.01.31