본문 바로가기

Python(알고리즘,문제풀이)/프로그래머스(입문100제)

코딩테스트입문 / 합성수 찾기

728x90

📚문제

출처 : 프로그래머스 / 합성수 찾기(https://school.programmers.co.kr/learn/courses/30/lessons/120846)

 

📝풀이

# 오류1. for문(while문) 내 리스트 초기화 오류 !

n =10
for i in range(1,n+1):
        result = []
        for j in range(1,i+1):
            n_divisor = []
            if i % j ==0:
                n_divisor.append(j)
                if len(n_divisor) >=3:
                    result.append()
print(len(result))

 

전에 프로그래머스에서 약수를 구할 때 어떻게 하는지 기억해서 풀었다

근데 이렇게 코드를 작성해주면 결과는 늘 0이 나온다.

 

그 이유는

while문과 for 문을 돌면서 그 안에서 선언된 리스트는 전부 초기화되기 때문이다

잘 기억하자....

 

 

+ 또 오류났었던 코드

 

#오류2. if문 위치(1)

def solution(n):
    
    result = []
    
    for i in range(1,n+1):
        n_divisor = []
        for j in range(1,i+1):
            if i % j ==0:
                n_divisor.append(j)
            	if len(n_divisor) >=3:
                	result.append(i)
    return len(result)

 

2번째 if문이 첫번째 if문의 밑으로 들어가게 되면,

i가 6인 경우에 

j가 차례대로 1,2를 거쳐 3이 되었을 때 len(n_divisor)는 3이상이 된다

 

이 때 i를 result에 추가하고 4,5를 거쳐 6이 됐을 때  마찬가지로 

첫번째 if문을 만족하고 2번째 if문에서 len(n_divisor)이 3이상이므로 i를 한번 더추가한다 ( 6을 두번추가 )

(4와 5는 첫번째 if문을 만족못하기 때문에 2번째 if문 까지 가진 않는다)

 

#오류3. if문 위치(2)

def solution(n):
    
    result = []
    
    for i in range(1,n+1):
        n_divisor = []
        for j in range(1,i+1):
            if i % j ==0:
                n_divisor.append(j)
            if len(n_divisor) >=3:
                result.append(i)
    return len(result)

 

첫번째 if문과 두 번째 if문을 동일선상에 놓게 되는경우이다

 

마찬가지로 i가 6인경우를 생각해보면,

첫 번째 if문에서 n_divisor에 추가 되는지 여부와 상관없이 

for문의 길이만큼(6번) len(n_divisor)를 확인한다

( 이렇게되면 j가 3,4,5,6일 때 모두 6을 result에 추가한다

-> 1,2,3까지 n_divisor에 추가되면 이미 len(n_divisor)가 3이상이고 4,5,6일때도 당연히 3이상이므로 6을 계속 추가)

 

# 최종 정답 코드

def solution(n):
    
    result = []
    
    for i in range(1,n+1):
        n_divisor = []
        for j in range(1,i+1):
            if i % j ==0:
                n_divisor.append(j)
        if len(n_divisor) >=3:
            result.append(i)
    return len(result)

 

따라서, for문이랑 동일선상에 두 번째 if문을 놓게된다면

for문이 모두 돌고 나서 최종적으로 len(n_divisor)가 3이상인지(합성수인지) 한 번만 확인하므로

result에도 해당 숫자가 한 번만 추가된다

 

(n_divisor는 첫 번째 for문 밑에 놓아야 계속 초기화되서 다음 i값에 대해 약수 개수를 구할 수 있다)

728x90