[프로그래머스] 같은 숫자는 싫어 (Lv.1)
문제 링크
문제 설명
배열 arr에서 연속으로 나타나는 같은 숫자를 제거하고 남은 배열을 반환한다.
순서는 유지되며, 연속이 아닌 중복은 제거하지 않는다.
예) [1, 1, 3, 3, 0, 1, 1] → [1, 3, 0, 1]
내 풀이
unique + erase 패턴을 활용했다.
unique()는 연속된 중복을 앞으로 밀어넣고 “쓰레기 구간”의 시작 iterator를 반환하므로,
erase()로 그 구간을 잘라내면 연속 중복이 제거된 배열이 완성된다.
이후 range-based for문으로 answer에 복사해 반환했다.
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
arr.erase(unique(arr.begin(), arr.end()), arr.end());
for(int temp : arr)
answer.push_back(temp);
return answer;
}
시간복잡도 분석
| 연산 | 복잡도 | 이유 |
|——|——–|——|
| unique() | O(n) | 배열을 한 번 선형 순회 |
| erase() | O(n) | 쓰레기 구간 삭제 시 뒤 원소 앞으로 이동 |
| range-based for | O(n) | answer에 복사 |
| 전체 | O(n) | |
arr의 최대 크기가 1,000,000이므로 O(n)은 충분히 통과 가능하다.
후기
풀고 나서 보니까 굳이 answer에 다시 값을 넣지 않고 그대로 arr을 반환했어도 됐다는 걸 알았다.
굳이 필요하지 않으면 빼자.