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

AlgorithmStack

문제

0~9로 이루어진 배열 arr에서 연속으로 나타나는 같은 숫자를 하나만 남기고 제거하라. 원소 순서는 유지한다. [1,1,3,3,0,1,1][1,3,0,1].

핵심

직전 값과 다를 때만 결과에 넣는다. 스택 분류지만 스택 없이도 풀린다.

풀이

#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    for (int x : arr)
        if (answer.empty() || answer.back() != x)
            answer.push_back(x);
    return answer;
}

메모

  • answer.back(): 마지막에 넣은 값 = 직전 값. 이것과 현재 값이 다를 때만 추가하면 연속 중복이 제거된다.
  • answer.empty() 체크: 첫 원소는 비교 대상이 없으므로 빈 배열일 때는 무조건 추가해야 한다. ||의 단축 평가로 empty일 때 back()이 호출되지 않는다.
  • unique + erase로도 가능하지만 원본 배열을 변경한다. 이 풀이는 새 벡터를 만들므로 원본을 건드리지 않는다.

복잡도

시간공간
O(N)O(N)