문제는 간단 합니다. 배열에 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가 저장된다(대신 정렬된 형태로)
'알고리즘 문제' 카테고리의 다른 글
[알고리즘문제] 프로그래머스 - 카카오프렌즈 컬러링북도움말 (0) | 2019.12.17 |
---|---|
[알고리즘 문제] 프로그래머스 - 기능개발 (0) | 2019.12.12 |
[알고리즘 문제] 프로그래머스 - 2016 (0) | 2019.12.04 |
카카오 코딩테스트 - 문자열 압축 (0) | 2019.12.03 |
[알고리즘 문제] 백준9095 - 1,2,3 더하기 (0) | 2019.12.02 |