문제 보기 · Level 1 · 고득점 Kit · 스택/큐 · 정답률 80% · 푼 사람 94,770명 (2026-09-30 기준)1

문제

0~9로 된 배열 arr에서 같은 숫자가 연달아 나오면 하나만 남긴다. 남은 수를 원래 순서대로 돌려준다. 떨어져 있다가 다시 나온 같은 숫자는 지우지 않는다.

  • arr 길이 최대 1,000,000

풀이

막히면 한 단계씩 펼친다.

필요한 개념

스택: 결과 리스트의 맨 끝(맨 위)만 보고 넣을지 정한다.

1단계 · 작은 예로 손으로 풀기

arr = [4, 4, 1, 1, 1, 4]

  • 4, 4 → 4 하나
  • 1, 1, 1 → 1 하나
  • 마지막 4는 앞의 4와 떨어져 있으니 남는다

답은 [4, 1, 4]다. “겹친 수를 모두 없애기”가 아니라 “바로 앞과 같으면 빼기”다.

2단계 · 가장 단순한 방법과 그 속도

한 번 훑으며 바로 앞 수와 비교하면 100만 번으로 끝난다. 반대로 “이미 결과에 있는 수면 빼기”(if x not in answer)로 짜면 두 가지가 틀린다. 떨어져서 다시 나온 4까지 지워 버리고, 리스트 in이 매번 결과를 훑어서 \(O(n^2)\)으로 느려진다.

3단계 · 핵심 아이디어

결과 리스트를 스택처럼 쓴다. 새 수를 넣기 전에 결과의 맨 끝만 본다.

  • 결과가 비었거나 맨 끝과 다르면 넣는다.
  • 맨 끝과 같으면 넣지 않는다.

떠올리는 신호: “연달아”, “바로 앞”이라는 말이 나오면 가장 최근 것(맨 위)만 보면 된다.

4단계 · 코드 흐름
  1. 빈 결과 리스트를 만든다.
  2. arr의 수를 하나씩 꺼낸다.
  3. 결과가 비었거나 결과의 맨 끝이 이 수와 다르면 넣는다.
  4. 결과를 돌려준다.
5단계 · 파이썬 코드
def solution(arr):
    answer = []
    for x in arr:
        if not answer or answer[-1] != x:
            answer.append(x)
    return answer
  • not answer: 결과가 비어 있으면 참이다. 빈 리스트는 거짓으로 친다.
  • or는 앞이 참이면 뒤를 보지 않는다. 그래서 결과가 비었을 때 answer[-1]을 꺼내다 오류가 나는 일이 없다.
  • answer[-1]: 결과의 맨 끝, 즉 스택의 맨 위다.
6단계 · 실행 추적

arr = [1, 1, 3, 3, 0, 1, 1]

x 결과의 맨 끝 넣나 결과
1 (비었음) 예 [1]
1 1 아니오 [1]
3 1 예 [1, 3]
3 3 아니오 [1, 3]
0 3 예 [1, 3, 0]
1 0 예 [1, 3, 0, 1]
1 1 아니오 [1, 3, 0, 1]
7단계 · 복잡도와 흔한 실수

한 번 훑으니 \(O(n)\)이다.

  • set(arr)로 겹침을 없애면 떨어진 같은 수까지 지워지고 순서도 흐트러진다.
  • 원래 배열에서 arr[i - 1]과 비교하는 방식으로 짜면 i = 0일 때 arr[-1](맨 끝 원소)과 비교하게 된다. 첫 원소와 끝 원소가 같으면 첫 원소를 빼먹는다. 파이썬의 음수 번호는 오류를 내지 않아 알아채기 어렵다.
검증: 문제의 예시 2개를 통과했고, 무작위 배열 2,000개에서 itertools.groupby로 이어진 같은 값을 묶는 다른 풀이와 결과가 같았다 — 10_pg12906_p1.py
  1. 프로그래머스 스쿨, “같은 숫자는 싫어” (https://school.programmers.co.kr/learn/courses/30/lessons/12906), 2026-09-30 조회. ↩