백준 2309 일곱 난쟁이를 풀던 도중
자꾸 index error와 name error가 나오는 것이다.
그러하여서 코드에 의문을 가지던 중
for문에서 리스트에 대한 값들을 하나씩 지워나가려는 부분에서 에러가 발생함을 알고
왜 이런 에러가 나는지 나의 뇌 알고리즘이 이해를 못하여서
검색을 하고 눈이 번쩍 뜨였다.
nam1,num2 = 0,0
nan_key = list(int(input()) for i in range(9))
for i in range(9):
for j in range(i+1, 9):
if sum(nan_key) - (nan_key[i] + nan_key[j]) == 100:
nan_key.remove(num1)
nan_key.remove(num2)
break;
nan_key.sort()
for k in nan_key:
print(k)
이렇게 코드를 짯는데 분명 내 머리 속에서는 되어야 했지만
name error가 나타났다.
예를 들어
num = [1,2,3,4,5]
for i in num:
print(i)
l.remove(i)
>1
>3
>5
num의 모든 원소들이 루프를 돌지 않는다.
이렇게 되면 num의 원소가 모두 지워지지 않고 남게 된다.
1번째 반복에서 0번째 원소 1을 지우므로 리스트가 [2,3,4,5]가 되고
2번째 반복에서 1번쨰 원소를 가져오는데 1번째 원소가 3이 되면서
즉, 2가 건너 뛰게 되면서 누락이 발생한다.
그러므로 아래 블로그에서 제시한
num = [1,2,3,4,5]
for i in num[:]:
print(i)
l.remove(i)
> 1
> 2
> 3
> 4
> 5
l[:]을 통해서 복사본을 루프에 넣고 돌리는 방식을 사용할 수 있다.
그리고 내가 문제를 푸는데 사용한 for문 안에서 값을 저장한 후 for 문 밖에서 제거하는 방법이 있다.
a = []
num = [1,2,3,4,5]
for i in num:
print(i)
a.append(i)
for i in a:
num.remove(i)
print(num)
>1
>2
>3
>4
>5
>[]
처럼 완벽하게 지울 수 있다.