문제 보기 · 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단계 · 코드 흐름
- 빈 결과 리스트를 만든다.
- arr의 수를 하나씩 꺼낸다.
- 결과가 비었거나 결과의 맨 끝이 이 수와 다르면 넣는다.
- 결과를 돌려준다.
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-
프로그래머스 스쿨, “같은 숫자는 싫어” (https://school.programmers.co.kr/learn/courses/30/lessons/12906), 2026-09-30 조회. ↩