[알고리즘 풀이] 프로그래머스 LV1 '같은 숫자는 싫어'

Taewan Kim·2019년 2월 10일
0
post-thumbnail

문제설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 배열 arr에서 제거 되고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 단, 제거된 후 남은 수들을 반환할 때는 배열 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 함수를 완성해 주세요.

제한사항

배열 arr의 크기 : 1,000,000 이하의 자연수
배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

예시

  • arr = [1,1,3,3,0,1,1] 인 경우 연속적인 숫자를 제거하면
    return [1,3,0,1]

  • arr = [4,4,4,3,3] 인 경우 연속적인 숫자를 제거하면
    return [4,3]


해설

접근방식

문제에서는 연속된 숫자를 제거하라고 했지만, 이와 다른 방식으로 접근해보았습니다.
제거보다는 숫자가 연속될 경우 중간에 다른 숫자로 바뀌는 지점이 있는데 그 지점에서 숫자를 빼오면 하나씩만 빼올 수 있습니다.
예를 들어,

  • [4, 4, 4, 3, 3]리스트에서 처음 4를 뽑고 4로 쭈욱~ 가다가 3으로 바뀌는 지점에서 3을 뽑으면 총 [4, 3]을 뽑을 수 있습니다.
def solution(arr):
    answer =[]
    compare = "&"

    for i in arr:
        if compare != i:
            answer.append(i)
            compare = i
    return answer
  1. 총 결과값을 담을 answer, 그리고 계속 숫자들과 비교하기 위한 compare을 설정합니다.

  2. arr에 있는 원소를 차례대로 비교하기 위해 for문을 돌립니다.
    예를 들어, [1, 1, 3, 3, 0, 1, 1]일 경우, 처음값인 1을 뽑아내기 위해 제한조건과 어긋나는 문자열인 "&"비교합니다.(그래야 compare과 i는 절대 같을 수 없기 때문에 answer에 넣을 수 있습니다.)

  3. 가장 중요한 것은 그렇게 숫자가 바뀌는 지점에서 answer에 i를 넣고나서인데, compare가 계속 "&"라면 결국 반환값은
    [1, 1, 3, 3, 0, 1, 1] 으로 동일할 것입니다.
    그래서 compare의 값을 "&"에서 그 지점의 숫자인 i를 넣어줍니다. 그러면 1로 가다가 3으로 바뀌는 지점에서 3을 answer에 넣고 compare은 3으로 바뀌고 다시 쭈욱 가다가 0으로 바뀌는 지점에서 0을 넣고....이렇게 연속적으로 갈 수 있습니다.

  4. 결국 맨 앞에 있는 숫자를 포함해서 answer에는 바뀌는 지점의 숫자인 [1, 3, 0, 1]이 들어갑니다.

추가풀이

def solution(arr):
    answer=[]
    compare=arr[0]
    del arr[0]
    answer.append(compare)
    
    for i in arr:
        if compare!=i:
            answer.append(i)
            compare=i
    return answer

채점결과

레벨1_같은숫자는싫어.PNG

profile
안드로이드 네이티브 앱 개발과 파이썬 공부중인 문과전공 대학생입니다 :)

0개의 댓글