[알고리즘] 프로그래머스 12906

은개·2025년 3월 6일

[CS] 알고리즘

목록 보기
2/21

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

정답

#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    vector<int> answer;

    for (int n : arr) {
        if (answer.size() == 0 || answer[answer.size() - 1] != n)
            answer.push_back(n);
    }

    return answer;
}


다른 사람 풀이

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    arr.erase(unique(arr.begin(), arr.end()),arr.end());

    vector<int> answer = arr;
    return answer;
}

💡

erase와 unique를 사용하면 컨테이너 내에서 중복된 원소를 지울 수 있다!

  • unique(): 연속된 중복 원소를 제거하고 새로운 끝 반복자(end)를 반환
    • 배열의 크기 변화 ❌
    • 중복이 제거된 원소들이 앞쪽으로 이동, 나머지 원소들은 기존의 배열에서 유지됨
      ex) {1, 1, 2, 2, 3, 3, 4, 5, 5}{1, 2, 3, 4, 5, ?, ?, ?, ?}

💡 erase()와 remove()의 차이

erase()

: 주어진 값을 컨테이너 내에서 실제로 삭제하고, 공백을 채우기 위하 삭제한 값 뒤의 원소들을 앞으로 당겨옴

  • 삭제된 원소 크기만큼 컨테이너 크기가 작아짐

사용 방법 01

  • 특정 위치의 원소 제거
vec.erase(삭제할 원소의 주소); 

// 예시 
vec.erase(vec.begin() + i);

사용 방법 02

  • 특정 범위의 원소 제거
vec.erase(삭제 범위의 시작 주소, 삭제 범위의 끝 주소); // 끝은 삭제 포함 X

// 예시 
vec.erase(vec.begin(), vec.begin() + i); 

remove()

: 주어진 값을 컨테이너 내에서 삭제(를 가장한 덮어쓰기)하고 마지막 인덱스 + 1 (end())을 반환

  • 삭제할 원소들의 위치에 유지될 원소들의 값으로 덮어씌움
  • 컨테이너의 크기 변화 ❌
  • 즉, 진짜로 삭제가 일어나는 것은 아님
    → 컨테이너의 뒤에 쓸데없는 데이터가 남겨짐

0개의 댓글