
https://school.programmers.co.kr/learn/courses/30/lessons/120846


def solution(n):
answer = 0
for i in range(1, n + 1):
divisor = []
for j in range(1, i + 1):
if i % j == 0:
divisor.append(i)
if len(divisor) >= 3:
answer += 1
return answer
1부터 n까지 반복하면서 약수들을 담아둘 지역 변수 divisor을 먼저 초기화한다.1부터 자기자신까지 약수 대상인지 체크하고, 약수라면 divisor 리스트에 추가한다.divisor 리스트의 길이가 3개 이상이면, 합성수이므로 개수를 추가한다.def solution(n):
output = 0
for i in range(4, n + 1):
for j in range(2, int(i ** 0.5) + 1):
if i % j == 0:
output += 1
break
return output
1 ~ 3 은 합성수가 될 수 없으니 4 부터 순회한다.i 가 j 의 배수라면 i 는 합성수이므로, 개수 추가. (배수가 아니라면 소수)O(nloglogn) 정도로 사실상 선형시간에 가깝다고 한다.16 의 약수는 1, 2, 4, 8, 16 이지만, sqrt(16) = 4 까지만 보면 2 와 4 를 찾을 수 있고, 약수는 a * b 쌍으로 존재하므로, 작은 쪽만 확인하면 큰 약수도 자동으로 판별된다.피드백은 언제나 환영입니다 :)