[프로그래머스] 같은 숫자는 싫어

김서연·2024년 2월 8일

코딩테스트

목록 보기
4/31
post-thumbnail

📜문제 설명

문제 바로가기

배열 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 함수를 완성해 주세요.

📍제한 사항

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

📍입출력 예시

arranswer
[1,1,3,3,0,1,1][1,3,0,1]
[4,4,4,3,3][4,3]

📄문제 해결

📝내가 푼 코드

def solution(arr):
    answer = [arr[0]]

    for a in arr[1:]:
        if answer[-1] != a:
            answer.append(a)

    return answer

문제는 같은 숫자가 2번 이상 연속되어 나올 때, 그 숫자를 1번으로 줄이는 것이다. 그러기 위해 입력받은 리스트를 순회하면서 연속되어 있지 않으면 결과 리스트에 추가하고, 연속되어 있으면(answer 리스트의 마지막 값과 같으면 연속이라고 볼 수 있다) 무시하도록 했다.

스택, 큐 카테고리에 있는 문제답게 리스트라는 변수 타입을 사용했지만 append()는 기본적으로 리스트의 마지막(인덱스 -1)에 값을 추가하기 때문에 스택, 큐 개념을 활용했다고 생각하면 될 것 같다.

📑다른 사람들의 풀이

def solution(arr):
    answer = []

    for a in arr:
        if answer[-1:] != [a]:
            answer.append(a)

    return answer

이 코드의 경우 나의 코드와 거의 같지만 디테일이 다른 경우라고 볼 수 있다.

나는 answer 리스트를 정의할 때 arr의 첫 값을 넣고, 순회할 때 슬라이싱이 아닌 단순 인덱싱을 활용했으나, 이 코드는 순회할 때 answer를 슬라이싱하고 비교할 값을 리스트로 만들어 비교했다.

answer를 정의할 때 빈 리스트로 할 수 있다는 점 때문에 코드가 깔끔해보일 순 있겠으나... if문에서 비교할 때 a를 리스트로 만들어 비교한다는 점, a[-1:]로 슬라이싱해야하는 점에서(결과 길이가 1이지만) 자원 사용 측면에서 효율적이지 못할 것이라는 생각이 들었다.

이 코드에 댓글을 인용하자면 내가 느낀대로 실제 코드로써의 효율은 불리하다고 한다. 리스트를 생성하는 것이니 메모리 할당 과정이 추가로 붙는다고 한다.

추가적으로 알아가는 개념도 있었는데, 이 코드를 통해 arr이 비었을 때 [-1:] 로 슬라이싱해도 인덱스 오류가 나지 않음을 알 수 있었다.


🤔느낀점

나와 비슷하지만 디테일이 다른 코드를 보면서 자연스럽게 자원 사용을 고려할 수 있게되어 스스로 어느정도는 성장했음을 느낄 수 있었다.

profile
가보자고! 🔥

0개의 댓글