파이썬 코테문제 질문
조회수 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 []
댓글 입력