본문 바로가기

파이썬(프로그래머스쿨)

리스트에서 같은 숫자가 연속으로 올때 연속으로 오는 숫자 모두 제거하는 방법[파이썬]

반응형

안녕하세요. 리스트에서 같은 숫자가 연속으로 올 때 연속으로 오는 숫자 모두 제거하는 방법을 알아보고자 합니다.

구글 서치 결과 중복된 숫자에 대해서 제거하는 방법은 나와도, 연속된 숫자가 나타날 시 두 숫자 모두 제거하는 방법은 안 나오더라고요. 오늘은 이거에 대해서 알아보고자 합니다.

 

문제 : 리스트에서 같은숫자가 연속으로 올 때 연속으로 오는 숫자 모두 제거
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

 

 

 

 

반응형