본문 바로가기
알고리즘 문제

[알고리즘 문제] 프로그래머스 - 같은 숫자는 싫어

by 박연호의 개발 블로그 2019. 12. 8.

문제는 간단 합니다. 배열에 0~9의 숫자가 있을 때, 어떤 x라는 숫자가 연속되어 나타난다면 그 수는 1번만 출력하도록 하려고 합니다

예를 들어서, 1 1 2 3 5 7 9 9 인 경우, 1은 2번 반복되니 1번만, 마지막에 9도 2번 반복되니 1번만 출력하게 되고 최종적으로는 11,2,3,5,7,9가 출력 됩니다.

 

문제는 아래의 3가지 방법으로 풀어 보았습니다.

// 1.내가 풀어본 방법
#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> arr) 
{
   vector<int> answer;
    
    int start = arr[0];
    
    for(int i=1;i<arr.size();i++){
        int now = arr[i];
        
        if(start!=now){
            answer.push_back(start);
            start=now;
        }
    }
    
    answer.push_back(arr[arr.size()-1]);
    

    return answer;
}

// 2. erase, unique 사용
#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;
}

// 3. set 사용
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

vector<int> solution(vector<int> arr){ 
    
    set<int> st;
    vector<int> temp;
    
    for(int n : arr){
        st.insert(n);
    }
    
    for(auto it = st.begin(); it != st.end(); it++){
        temp.push_back(*it);
	}

    return temp;
}

 

1. 내가 풀어본 방법

단순히 사람이 생각할 수 있는 직관적인 방법으로 풀어 보았습니다.

처음 숫자를 기억한 다음에, 배열의 1~마지막 까지 탐색을 하면서 나와 숫자가 다른게 나타나면 먼저 나의 숫자를 vector에 넣고, 나의 숫자에 다른 숫자를 넣습니다. 이렇게 마지막 까지 반복하게 됩니다.

그리고 마지막의 경우, 값을 비교할 수 있는 대상이 있어야 값을 넣는데 그런 기준값이 없기 때문에 마지막 값은 임의로 넣어주었습니다.

 

2. erase, unique방법

가장 보편화된(?)방법입니다.

erase(s,v) : s~v사이의 값을 제거합니다.

unique(s,v) : 쓰레기 값의 첫번쨰 위치

쓰레기 값 : 1 1 2 3 4 4을 unique하면 1 2 3 4 1 4가 되는데, 이때 1 2 3 4 1 4에서 뒤의 1,4가 쓰레기 값이 되며, 여기서 쓰레기 값의 첫번쨰 위치를 의미한다.  

 

3. set 사용

set은 중복된 원소를 여러개 가지지 않으므로, 1 1 1 2 3 4 4 5를 set에 넣어도 결국에는 1 2 3 4 5가 저장된다(대신 정렬된 형태로)