파이썬 코테문제 질문

조회수 305회
def solution(n):
    answer = []


    # 일단 약수를 전부 뽑기, 이후 약수중에서 소수인 것만 남기기.
    for i in range(2,n+1):
        if n%i == 0:
            answer.append(i)


    for i in answer:
        cnt = 0
        for j in range(1,i+1):
            if i % j == 0:
                cnt += 1
            if cnt >= 3 :
                answer.remove(i)
                break


    return answer

위 포문에서 answer 을 약수리스트로 만들고 밑 포문에서 약수를 하나씩 검사해 합성수인 걸 제거하고 싶은데, 결과가

테스트 1
입력값 〉   12
기댓값 〉   [2, 3]
실행 결과 〉   실행한 결괏값 [2,3,6]이 기댓값 [2,3]과 다릅니다.

테스트 2
입력값 〉   17
기댓값 〉   [17]
실행 결과 〉   테스트를 통과하였습니다.

테스트 3
입력값 〉   420
기댓값 〉   [2, 3, 5, 7]
실행 결과 〉   실행한 결괏값 [2,3,5,7,12,15,21,30,42,70,105,210]이 기댓값 [2,3,5,7]과 다릅니다.

이런식으로 나옵니다.

왜 제거 되는 것도 있고 안되는 것도 있는지, 도저히 이유를 모르겠습니다. 예를 들어 테1 에서 6으로 아래 포문을 돌려보면 cnt 가 3을 초과해 remove 돼야하는데, 되지가 않습니다.

1 답변

  • for i in answer:
         # answer 변경
    

    이런식으로 하면, 쉽게 예측하기 힘든 오류가 발생됩니다.

    아주 간단한 예입니다.

    >>> lst = [ 1, 2, 3, 4, 5 ]
    >>> for i in lst:
        print(i, lst)
        lst.remove(i)
    
    
    1 [1, 2, 3, 4, 5]
    3 [2, 3, 4, 5]
    5 [2, 4, 5]
    >>> lst
    [2, 4]
    

    리스트컴프리헨션 안에서 조건에 맞는 것만 남기는 필터링을 하던가, answer 가 아닌 새로운answer 을 하나 복사하여 사용하거나 해야 합니다.

    >>> lst = [ 1, 2, 3, 4, 5 ]
    >>> for i in lst[:]:
        print(i, lst)
        lst.remove(i)
    
    
    1 [1, 2, 3, 4, 5]
    2 [2, 3, 4, 5]
    3 [3, 4, 5]
    4 [4, 5]
    5 [5]
    >>> lst
    []
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)