브루트 포스 기초문제
약수 구하기 (2501) [브론즈 III]
n, k = map(int, input().split())
divider = []
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
divider.append(i)
if i != int(n / i):
divider.append(int(n / i))
divider = sorted(divider)
if len(divider) >= k:
print(divider[k - 1])
else:
print(0)

- 최대한 단순하게 구현했다. 약수 리스트를 만들고 정렬했다.
- 정렬하는 과정에서 시간복잡도가 증가할 가능성을 막아보고자
deque
를 활용해보았다.
from collections import deque
n, k = map(int, input().split())
divider_left = deque([])
divider_right = deque([])
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
divider_left.append(i)
if i != int(n / i):
divider_right.appendleft(int(n / i))
divider = divider_left + divider_right
if len(divider) >= k:
print(divider[k - 1])
else:
print(0)

- 예상과 달리 시간이 더 걸렸다. (40ms -> 68ms)
- 두 개의 리스트를 합하는 것에서 시간이 더 소요된 것으로 보였다.
sorted
는 O(n log n)
의 시간복잡도가 소요되지만 extend
(리스트 끼리의 +
연산과 같음)는 O(확장하는 길이)
만큼 소요된다.
- 즉 케이스의 수가 커짐에 따른 소요 시간 증가폭은
deque
를 이용한 솔루션이 좀 더 걸릴 수 있는 것이다.
완전 제곱수 (1977) [브론즈 II]
import math
m = int(input())
n = int(input())
s = math.ceil(m ** 0.5)
powed = []
while (s * s) <= n:
powed.append(s * s)
s += 1
if len(powed) > 0:
print(sum(powed))
print(powed[0])
else:
print(-1)

- 문제의 이상, 이하 조건이 있어 확인해야했다.
- 처음에
int
로 버림을 진행하고 1을 더해줬는데, 위의 조건에서처럼 다른 수가 입력되면 문제 없었으나, 64와 같은 제곱수가 들어오면 오답이 발생했다.