안녕하세요. 리스트에서 같은 숫자가 연속으로 올 때 연속으로 오는 숫자 모두 제거하는 방법을 알아보고자 합니다.
구글 서치 결과 중복된 숫자에 대해서 제거하는 방법은 나와도, 연속된 숫자가 나타날 시 두 숫자 모두 제거하는 방법은 안 나오더라고요. 오늘은 이거에 대해서 알아보고자 합니다.
문제 : 리스트에서 같은숫자가 연속으로 올 때 연속으로 오는 숫자 모두 제거
list_result = [4, 3, 1, 1, 3, 2, 4]
list_result는 1~4까지 넣은 숫자열입니다. 이 상황에서 값이 연속으로 나오는 숫자에 대해서만 삭제하고 싶습니다.
예를 들어 지금 1,1 이 겹치므로 삭제가 되면 [4,3,3,2,4]가 남게 될 것이고, 또 여기서 3,3 이 겹치므로 마지막에는 [4,2,4]만 남게 될 것입니다.
<잘못된 풀이>
def list_dup(list_result):
for i in range(1,len(list_result)):
if list_result[i] ==list_result[i+1]:
del list_result[i]
return list_result
먼저 잘못된 풀이입니다. 이 식은 for 문을 사용해서 list_result값의 리스트 옆에 있는 숫자를 파악하고, 같으면 list_result값을 제거하는 식입니다.
하지만 이렇게 작성하면 무조건 오류가 발생합니다. (IndexError: list index out of range) 그 이유는 조건 만족 후 제거 시 리스트의 크기가 바뀌어서 범위밖의 데이터를 찾아 오류가 발생하게 됩니다.
그렇다면 어떻게 해야할까요?
다시 한번 리스트를 추가해야 합니다. 처음 list_result에 있는 리스트들을 다시 쌓을 수 있도록 새로운 리스트변수 list_dup을 생성합니다.
그다음 list_dup에 list_result를 하나씩 순서대로 쌓습니다. 이때, 쌓으면서 만약 이전숫자와 다음숫자가 같으면 제거하는 식으로 만들어보도록 하겠습니다.
def duplication(list_result):
list_dup = []
answer = []
for i in range(0, len(list_result)):
list_dup.append(list_result[i]) # 리스트_결과1에 리스트_결과를 순서대로 쌓는다.
if list_dup[-1:] == list_dup[-2:-1]: # 쌓이는 마지막행과 마지막 이전행끼리 같으면
answer += list_dup[-1:] #answer 리스트에 같은번호를 추가하고
list_dup = list_dup[:-2] #list_dup리스트에 중복된걸 제외하고 다시쌓는다.
return list_dup
<순서>
1. list_dup에 리스트_결과를 순서대로 쌓는다.
2. 쌓이는 마지막행과 마지막 이 전행끼리 같으면
3. answer 리스트에 같은 번호를 추가하고
4. list_dup리스트에 중복된 걸 제외하고 다시 쌓는다.
이렇게 하면 list_dup에는 4,2,4의 리스트만 쌓인 걸 확인할 수 있습니다.
print(duplication(list_result)) = [4,2,4]
또 다른 변수 answer에 대한 것은 [1,3]이 쌓였는데, 이는 중복해서 제거한 숫자를 뜻합니다.
그런데 이 방법은 stack 을 사용하는 방법과 거의 유사합니다.
stack에 대해서 다음에 시간이 되면 알아보도록 하겠습니다.
위에 식에서 아래 식을 대입해도 돌아갈 것입니다.
if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop(-1)
stacklist.pop(-1)
answer += 2
break
'파이썬(프로그래머스쿨)' 카테고리의 다른 글
[파이썬] 두개의 리스트에서 동일한 원소들을 제거하는 방법 (0) | 2022.12.30 |
---|---|
리스트 안에서 특정값들(리스트)에 해당하는 값만 출력하고 싶을때[파이썬] (2) | 2022.12.24 |
[파이썬] 리스트안에 2차원배열의 위치바꾸기!( feat. 최소 직사각형 문제) (0) | 2022.12.21 |