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

1 분 소요

문제

배열 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보다 작거나 같은 정수

나의 풀이:

def solution(arr):
    answer = []
    prev = None
    for i in arr:
        if i != prev:
            answer.append(i)
        prev = i
    return answer

배열의 값들을 순차적으로 검색하면서 현재 검색한 값이 이 전에 왔던 값과 중복되지 않는다면 answer 라는 새 배열에 값을 추가하도록 하였다. 이 때 이전 값과의 비교를 위해 prev라는 변수를 사용했다.

실행 결과 효율성은 다음과 같았다.

1

다른 사람들의 풀이

# 풀이 1.
def solution(s):
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

# 풀이 2.
def solution(s):
    return [s[i] for i in range(len(s)) if [s[i]] != s[i+1:i+2]]

# 풀이 3.
def solution(s):
    result = []
    for c in s:
        if (len(result) == 0) or (result[-1] != c):
            result.append(c)
    return result

배열의 값을 비교하기 위해 나는 prev 라는 새로운 변수를 만들어서 비교한 반면, 다른 사람들의 풀이는 대부분 인덱싱을 사용했다.

인덱싱을 사용하니 확실히 코드 라인 수가 줄어들어 보기에 훨씬 간결하여 나는 왜 인덱싱을 사용할 생각을 못했을까라는 생각이 들었다.

그런데, 다른 사람들이 작성한 코드의 효율성이 궁금해서 돌려보니 오히려 효율성은 내가 작성한 코드가 훨씬 좋았다.


풀이 1번의 실행결과다.

인덱싱을 ‘a[-1:]’ 한번 사용해서 100ms 대의 실행시간이 걸리게 된 것으로 보인다.

2

풀이 2번의 실행결과다.

코드는 한 줄로 정리되어서 좋은 코드라고 생각했는데, 인덱싱이 ‘s[i]’, ‘s[i+1:i+2]’ 두 번 사용되면서 실행시간이 풀이 1번보다도 더 늘어났다.

3

풀이 3번의 실행결과다.

내가 작성한 코드와 형태가 가장 비슷하여 확인해보았는데 마찬가지로 인덱싱을 사용했기 때문인지 실행시간이 100ms 대로 나왔다.

4


문제를 풀 때마다 당연히 다른 사람들이 나보다 더 좋은 코드를 작성했을거라고 생각하며 제출을 했는데 이번 문제에서 처음으로 다른 사람들의 풀이보다 더 효율적인 코드를 작성했다는 사실에 조금 뿌듯했다. (물론 인덱싱 사용을 생각하지 못했기 때문에 얻어걸린 면이 있긴 하지만…)

이렇게 같은 문제를 풀어도 하나의 정답만이 존재하지 않는다는 게 코딩의 매력인 것 같다. 더 효율적인 방법이 있다면 당연히 참고하되, 내가 작성한 코드에 대한 무한한(?) 불신은 조금 내려놓아도 될 것 같다.

댓글남기기