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

kiki·2022년 1월 31일
0

프로그래머스

목록 보기
2/76

문제 링크

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

문제 설명

문제를 간단하게 설명하자면, arr가 주어지는데 여기서 arr에 연속되는 숫자가 존재하면 하나만 남기고 없애버리는 것이다. 즉 중복은 허락되지만 연속을 허락되지 않는 것.
예시) arr = [1,1,1,2,5,5,3] -> return [1,2,5,3]

1차 시도

문제를 어떻게 풀지 다양하기 생각해봤는데 처음엔 현재 요소와 다음 요소가 같은 값일 경우 기존 리스트에서 다음 요소를 제거해버리는 방식을 쓰려고 했는데 그렇게 하면 당연히 index error가 난다. 그래서 새로운 배열에 추가하는 방식으로 해보려고 시도했다.

def solution(arr):
    answer=[arr[0]]
    for i in range(1,len(arr)):
        if(arr[i]!=answer[-1]):
            answer.append(arr[i])
    return answer
  1. 반환할 리스트에 arr의 첫 요소를 넣어주고
  2. arr의 두번째([1]) 요소부터 for문을 돌면서 반환할 리스트의 마지막 요소와 같은 값을 같는지 확인.
  3. 같지 않다면 반환할 리스트에 append.

처음엔 answer을 빈 리스트로 시작해서 for문을 0부터 돌려고 했지만 그러니 answer[-1]을 하는 부분에서 빈 리스트에 -1 인덱스로 접근하니 index error가 나서 answer에 arr의 첫번째 요소를 넣어주고 시작했다.

다른 사람의 풀이를 보니 빈 리스트로 시작할 수 있는 방법이 있었다. 보고 작성한 2차 시도

2차 시도

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

answer의 빈 리스트로 시작하고 if문에서 요소를 비교할때 리스트로 비교를 해주는 방법이 있었다. 코드는 조금 더 깔끔하지만 효율성 테스트에서 더 낮은 효율을 보여줬다. 아마 1차 시도에선 요소를 비교하고, 여기선 리스트를 비교하기때문 아닐까?

정리

프로그래머스의 신규 아이디 추천 문제에서는 연속되는 마침표(.)을 하나로 줄이는 문제가 있었는데 거기서는 제한된 요소를 연속 제거하는 거여서 replace("..", ".")를 이용했었다.
정리하니 다시 생각나고 좋군

0개의 댓글