자료구조,알고리즘(Python)/알고리즘(Python)

10871번 : Python(remove() 이용 시 주의할 점)

드롱드롱 2024. 8. 29. 16:50

 

https://www.acmicpc.net/problem/10871

 

간단한 문제이다.

그러나 이 문제에서 평소 자주 쓰지만 맨날 구글링해서 가져오는 기능을 확실히 내 것으로 만들기 위해 포스팅한다.

 

n,x= map(int,input().split())
list1 = list(map(int,input().split()))

for i in list1[:]:
    if i >= x:
        list1.remove(i)
print(*list1)

 

 

1. 리스트에서 요소 제거

리스트에서 요소를 제거하는 방법에서는 크게 2가지가 있다.

리스트 요소를 직접 참조하여 제거하는 것과 리스트 인덱스를 이용해서 제거하는 것이 그것이다.

 

1-1. 리스트 요소를 직접 참조하여 제거

리스트 요소를 직접 참조하여 제거하는 함수는 'del'이다. 

ex) del 리스트_이름[참조할 요소]

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> del a[1]
>>> a
[1, 3, 4, 5, 6, 7]

 

이런식으로 리스트의 요소를 제거하는 방법과

 

1-2. 리스트 인덱스를 이용해서 제거

리스트 인덱스를 이용해서 제거하는 함수는 'remove()'이다.

ex) remove(i)

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a.remove(3)
>>> a
[1, 2, 4, 5, 6, 7]
>>> a.remove(9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

 

또, remove()를 사용할 때 겪을 수 밖에 없는 error가 있다. for문에서 remove를 사용하면서 요소들을 지워나가면 요소는 제거되었지만 참조하는 index는 그대로 +1이 되기 때문에 문제가 생긴다.

한 마디로 remove과정에서 원본 리스트를 사용하면 문제가 된다.

 

for i in list1[:]:
    if i >= x:
        list1.remove(i)

 

이 문제를 고치는 방법은 매우 간단하다. for문에서 list의 원본을 사용하는 것이 아니라 list1[:]처럼 복사본을 사용하면 된다. 실제로 remove하는 리스트는 원본 리스트이지만, 참조하는 리스트는 복사본인 것이다!

 

 

2. 리스트 요소 한 줄로 출력해야 할 경우

 

 

' '.join(리스트_이름)이 원래 알고 있는 방법이었는데, join함수 같은 경우에는 문자열밖에 반환을 하지 못한다고 한다. 그러므로 int로 구성되어 있는 리스트의 경우 매우 간단하게 print(*리스트이름) 이렇게 처리하면 된다.

 

 

 

 

참고한 사이트

https://yeomss.tistory.com/160

 

Python 리스트 요소 한줄에 한번에 출력하기

알고리즘을 풀다가 보면 1차원 리스트 요소를 아래와 같이 한번에 출력하고 싶을 때가 있습니다. arr = [1, 2, 3, 4] ➡️ 1 2 3 4 보통 for 문을 이용하여 출력하는 경우가 많습니다. for x in arr: print(x, en

yeomss.tistory.com

 

 

https://dduniverse.tistory.com/entry/python-list%EC%97%90%EC%84%9C-remove-%EC%82%AC%EC%9A%A9-%EC%8B%9C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90

 

python | list에서 remove 사용 시 주의할 점

다음과 같은 리스트가 있다. num_list=[15,16,22,28] 홀수인 15만을 남기기 위해 짝수를 제거하는 코드를 작성했고, 결과는 다음과 같았다. 22는 짝수인데 왜 지워지지 않고 남아있는 거지? 그 이유는 다

dduniverse.tistory.com