📚문제
📝풀이
# 오류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값에 대해 약수 개수를 구할 수 있다)
'Python(알고리즘,문제풀이) > 프로그래머스(입문100제)' 카테고리의 다른 글
코딩테스트입문 / 문자열 정렬하기(1) (0) | 2023.07.23 |
---|---|
코딩테스트입문 / 팩토리얼 (0) | 2023.07.22 |
코딩테스트입문 / 배열 회전시키기 (0) | 2023.07.21 |
코딩테스트입문 / 공 던지기 (0) | 2023.07.21 |
코딩테스트입문 / 구슬을 나누는 경우의 수 (0) | 2023.07.20 |