| 1트
def solution(N, P, Q):
sieve = [1 for _ in range(N + 1)]
sieve[0]=sieve[1] = 0
i = 0
while i * i <= N:
if sieve[i]:
k = i * i
while k <= N:
sieve[k] = 0
k += i
i+= 1
prime = []
for i, is_prime in enumerate(sieve):
if is_prime:
prime.append(i)
#print(prime)
semi_prime = [0 for _ in range(N + 1)]
for num in prime:
for next_num in prime:
if num * next_num > N:
break
else:
#print(num * next_num)
semi_prime[num * next_num] = 1
#print(semi_prime)
answer = []
for (start, end) in zip(P, Q):
count = 0
for idx in range(start, end + 1):
if semi_prime[idx]:
count += 1
answer.append(count)
#print(answer)
return answer
- 일단 아무 생각 없이 소수 구하고 -> 소수 * 소수로 semi_prime 구하고 -> 갯수 세기를 했다
- 엄청 오래걸릴 줄 알았는데 생각보다 오래 안걸렸다
- 하지만 몇몇개 time out이 걸렸다
결과는 여기에
| 2트
def solution(N, P, Q):
sieve = [1 for _ in range(N + 1)]
sieve[0]=sieve[1] = 0
i = 0
while i * i <= N:
if sieve[i]:
k = i * i
while k <= N:
sieve[k] = 0
k += i
i+= 1
prime = []
for i, is_prime in enumerate(sieve):
if is_prime:
prime.append(i)
#print(prime)
semi_prime = [0 for _ in range(N + 1)]
for num in prime:
for next_num in prime:
if num * next_num > N:
break
else:
#print(num * next_num)
semi_prime[num * next_num] = 1
#print(semi_prime)
answer = []
semi_count = 0
semi_prime_count = [0 for _ in range(N + 1)]
for i, num in enumerate(semi_prime):
if num:
semi_count += 1
semi_prime_count[i] = semi_count
#print(semi_prime_count)
for (start, end) in zip(P, Q):
answer.append(semi_prime_count[end] - semi_prime_count[start - 1])
#print(answer)
return answer
- 해당 index까지 semi_prime이 몇번 등장했나 그때그때 세는게 아니라 미리 처음부터 N+1까지 세어놓고 사용하기로 했다
- 그래서 timeout이 걸리지 않게 되었다
결과는 여기에