NIRVANA

[level 1] 같은 숫자는 싫어(다시??) 본문

Coding test(Python3)/Programmers

[level 1] 같은 숫자는 싫어(다시??)

녜잉 2023. 7. 17. 19:33

문제

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

 

문제 풀이 접근법1

1) arr의 i번째 원소와 i+1번째 원소를 비교하여 같으면 리스트에서 i번째 원소를 삭제한다.

2) arr리스트를 반환한다. 

def solution(arr):
    #answer = []
    
    for i in range(len(arr)-1):
        if arr[i] == arr[i+1]:
            del arr[i]
    return arr

이 풀이에는 아주 큰 문제가 있었다.. 바로바로

리스트가 삭제되면서 arr의 길이가 줄어든다는...단점이었다....

자꾸 out of index 오류가 나는 이유가 있던 거였다!

len을 상수값으로 해도 문제가 해결되지 않았다... 왜냐면 당연히 arr 배열이 실시간으로 바뀌니까...

i가 가리키는 위치가 내가 예전에 가리키고 있던 그 위치가 아니겠지 

https://computer-with-me.tistory.com/entry/%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EA%B0%80-%EC%97%B0%EC%86%8D%EC%9C%BC%EB%A1%9C-%EC%98%AC%EB%95%8C-%EC%97%B0%EC%86%8D%EC%9C%BC%EB%A1%9C-%EC%98%A4%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%AA%A8%EB%91%90-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

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

안녕하세요. 리스트에서 같은 숫자가 연속으로 올 때 연속으로 오는 숫자 모두 제거하는 방법을 알아보고자 합니다. 구글 서치 결과 중복된 숫자에 대해서 제거하는 방법은 나와도, 연속된 숫자

computer-with-me.tistory.com

대신 다음과 같이 리스트를 새로 만들어서 쌓으면 된다고 한다..

나중에 좀 더 생각해보기!

 

문제 풀이 접근법2

1) arr의 i번째 원소와 i+1째 원소가 같다면 i를 answer에 추가한다.

2) answer에 없는 원소를 arr리스트에서 찾아 answer에 추가한다.

3) 이때, 원소의 위치가 바뀌면 안되므로 or로 조건문을 묶는다. 

=> 이 풀이법은 [4, 4, 4, 3, 3]에서는 적용되지 않았다

 

 

문제 풀이 접근법3

1) i==0, 즉 첫번째 원소를 answer 리스트에 추가한다.

2) i번째 원소와 i+1번째 원소를 비교하여 서로 다르다면  i+1번째 원소를 answer 리스트에 추가한다. 

아래 블로그의 글을 보고 첫번째 힌트를 얻었다..!

참고: https://wooaoe.tistory.com/68

 

[Python] 프로그래머스 같은 숫자는 싫어 파이썬 코드

문제 설명 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거

wooaoe.tistory.com

def solution(arr):
    answer = []
    
    for i in range(len(arr)-1):
        if i == 0:
            answer.append(arr[i])
        if arr[i] !=arr[i+1]:
            answer.append(arr[i+1])
    return answer

어차피 둘둘씩 비교하고

첫번째 숫자를 무조건 리스트 안에 넣어놓으면 그 다음부터 i+1값이 같든 틀리든 해당 값은 

무조건 리스트에 들어가게 되니까.. 

좋다...

 

 


다른 분들 풀이

def no_continuous(s):
    # 함수를 완성하세요
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( no_continuous( "133303" ))

사실 이해가 잘 안되어서 코드를 돌려 보았다!

처음 a[-1:]은 공백이 출력 되므로 반복문이 s-1만큼 돌아가게 되면 

a는 [], 1, 1, 3, 3, 0, 1

i는   1, 1, 3, 3, 0, 1, 1 

이렇게 나오게 된다. 위에 있는 133303역시 

a는 [], 1, 3, 3, 3, 0

i는   1, 3, 3, 3, 0, 3

이므로 연속 되는 원소들은 제거하고 나오게 되는것이다. 

결국 여기도 '맨 첫번째 원소는 무조건 리스트에 넣는다'가 적용되었다. 

다음번에 연속되는 원소 중 중복이 있으면 제거~

이런 문제가 나오면 일단 맨 처음 원소는 무조건 리스트에 넣고 시작해봐야겠다.