공부/알고리즘

프로그래머스 같은 숫자는 싫어 C++

윙승 2024. 4. 30. 20:54
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스의 스택/큐 문제인데 주어진 배열에서 연속적으로 나타나는 숫자들을 제거하고, 나타난 순서대로 유지하여 반환하는 함수를 구현하는 문제입니다.

 

이런 배열이 있다고 칩시다.

 

 

해당 배열에 존재하는 '연속적으로 같은 숫자가 들어있는 경우'는 3가지로 1,3,1이 있습니다. 이 것을 프로그래밍적으로 어떻게 뺄까?

 

저는 스택/큐 문제니까 스택으로 풀어보려고 했습니다.

그런데 이럴수가, 만들어보니까 스택은 후입선출 구조기 때문에 넣고 바로 전 원소와 현재 원소를 비교하는 것은 빠르지만 꺼낼 때 반대로 정렬되게 됩니다.

 

 

그래서 큐를 사용해 배열을 비교해 큐에 넣을 것들을 골라 추가했습니다.

num.push(arr[0]);
for(int i = 1; i<arr.size(); i++){
    if(arr[i-1] != arr[i])
        num.push(arr[i]);
}

 

#include <vector>
#include <iostream>
#include <queue>

using namespace std;

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

    queue<int> num;
    num.push(arr[0]);
    for(int i = 1; i<arr.size(); i++){
        if(arr[i-1] != arr[i])
            num.push(arr[i]);
    }
    
    while(!num.empty()){
        answer.push_back(num.front());
        num.pop();
    }

    return answer;
}

 

이 문제를 푸는것 자체는 쉬웠는데 '연속적으로 나타나는 숫자는 제거하고 남은 수들을 return' 이 문구를 보자마자 아! 해시를 써서 중복을 제거하면 되겠다! 라고 생각해버려서 Set을 사용해 문제를 잘못 풀었던 경험이 있습니다. '연속적'을 '중복'이라고 생각해버려 생긴 문제로 테스트케이스를 돌려보다가 첫 번째 테스트 케이스의  답 [1,3,0,1]이 [1,3,0]으로 나와서 그제야 문제를 다시 봤습니다.

결국 맞추긴 했지만 다음부터는 문제를 꼼꼼하게 잘 읽어야겠습니다...

 


 

다른 사람들으 이 문제를 어떻게 풀었는지 궁금해서 봤는데 엄청난 풀이를 봤습니다.

 arr.erase(unique(arr.begin(), arr.end()),arr.end());

 

unique가 뭔지 궁금해서 찾아봤더니 범위 내에 연속적으로 존재하는 함수를 삭제하는 데 사용한다고 합니다.

정확히는 unique 함수가 vector 배열에 연속적으로 존재하는 값들을 배열 뒤에 쓰레기 값으로 몰아두고 그 값이 시작되는 부분을 반환한다고 합니다.

그래서 그 시작부분과 끝부분까지 지우는 방식으로 하는 것 같습니다.

728x90
반응형