코딩테스트/PYTHON

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

_알파카 2024. 8. 6. 17:37
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

내 풀이

def solution(arr):
    # answer의 초기값을 arr의 첫 번째 값으로
    answer = [arr[0]]
    for i in range(len(arr)):
        # arr 원소와 answer의 직전 값이 같지 않으면 arr 원소 삽입
        if arr[i] != answer[-1]:
            answer.append(arr[i])
    return answer

 

간단하게 set을 쓰면 될 것 같지만, set을 사용하면 안된다. 

set은 본래 리스트의 순서 보장이 되지 않기 때문이다. 

 

또한, 단순히 중복만을 제거하면 안된다. 

왜냐하면 연속적으로 나타나는 숫자만 제거하는 것이기 때문이다. 

즉, [1, 1, 3, 3, 0, 1, 1]을 단순히 중복제거하면 [1, 3, 0]이 되지만, 

우리가 원하는 값은 [1, 3, 0, 1] 이다. 

 

먼저, answer 배열의 초기값을 arr의 첫 번째 값으로 초기화한다. 

이 후, answer 배열의 가장 마지막 값과 현재의 arr 배열의 원소 값이 같지 않으면 answer 배열에 arr 원소를 새롭게 삽입한다. 

 

arr 배열의 크기가 1,000,000 이하이기 때문에 시간 초과가 날 수도 있지 않을까 고려했지만, 

다행히 시간 초과는 나지 않았다!

 

다른 사람 풀이

def solution(arr):
    answer = []
    for i in arr:
        if answer[-1:] == [i]: continue
        answer.append(i)
    return answer

 

answer[-1:]을 새롭게 알게 되었다. 

이는 값이 없어도 비교가 가능하다. 

list[-1:]은 빈 리스트로 처리가 되기 때문에, 값을 비교하는 것에 문제가 없다!

list[-1:]은 마지막 위치의 데이터부터(포함) 마지막까지라는 의미로, 마지막 데이터만을 의미한다. 

my_list = [1, 2, 3, 4]
print(my_list[-1:])  # 출력: [4]

empty_list = []
print(empty_list[-1:])  # 출력: []

# 빈 리스트의 경우
empty_list = []
print(empty_list[-1:] == [])  # 출력: True

# 값이 있는 리스트의 경우
my_list = [1, 2, 3, 4]
print(my_list[-1:] == [4])  # 출력: True
print(my_list[-1:] == [3])  # 출력: False

 

728x90