https://school.programmers.co.kr/learn/courses/30/lessons/120890
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> array, int n) {
int answer = 0;
vector<pair<int,int>> v;
for(auto c: array){
v.push_back({abs(n-c),c});
}
sort(v.begin(),v.end());
answer=v[0].second;
return answer;
}
내가 제출한 코드가 위와 같은 형태인데, 처음에 제출한 코드는 push_back() 대신에 emplace_back()을 사용한 코드를 작성해서 제출하였다. 그런데 정상적으로 동작하지 않고,
/solution0.cpp:11:11: error: no matching member function for call to 'emplace_back'
v.emplace_back({abs(n-c),c});
~~^~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1209:2: note: candidate template ignored: substitution failure: deduced incomplete pack <(no value)> for template parameter '_Args'
emplace_back(_Args&&... __args);
^
1 error generated.
테스트 결과 (~˘▾˘)~
2개 중 0개 성공
이와 같은 결과를 보여주면서 런타임에러가 발생해서, 일단 push_back()으로 수정하여서 통과하고 난뒤에 왜 emplace_back()을 사용할 수 없는지에 대해서 검색해보았다.
emplace_back() vs push_back when inserting a pair into std::vector
I defined the following std::vector<std::pair<int,int> > my_vec; my_vec.push_back( {1,2} ); //this works my_vec.emplace_back( {1,2} ); // this doesn't work std::pair<int,int> tem...
stackoverflow.com
vector pair emplace_back() 에 대해서 검색해보면 위에 첨부한 것과 같은 내용의 글을 볼 수 있다.
간략하게 답변 내용에서 이유를 찾아보자면, { a, b} 형태로 넘겨주면 이런 형태의 타입이 존재하지 않아서 넣을 수 없다고 하는것으로 보여진다. 이렇게 넣기 위해서는 emplace_back(a,b); 형태로 넣어야 한다고 설명해주고 있다. 이 부분에 대해서는 아직 완벽한 이해가 부족하다고 느끼지만, push_back()을 사용하면 { a, b} 형태로 pair로 넣을 수 있고, empace_back()을 사용하면 ( a,b ) 형태로 넣어야 한다고 알고 넘어가도록 하자.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> array, int n) {
int answer = 0;
vector<pair<int,int>> v;
for(auto c: array){
v.emplace_back(abs(n-c),c);
}
sort(v.begin(),v.end());
answer=v[0].second;
return answer;
}
이렇게 코드를 수정하면 emplace_back() 을 사용하더라도 정상적으로 통과된다.
추가적으로, 다른사람의 풀이를 볼때 가장 위에 올라와있는 풀이를 첨부해보면,
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> array, int n) {
sort(array.begin(), array.end());
int closest = abs(array[0] - n);
int pos = 0;
for(int i = 1; i<array.size(); i++)
{
if(closest > abs(array[i] - n)) {
closest = abs(array[i] - n);
pos = i;
}
}
return array[pos];
}
이러한 풀이가 있는데, 이 풀이의 경우는 sort를 한뒤에, 순서대로 closest라는 변수를 갱신하면서, 그때에 position 값을 출력해주는 형태의 코드이다. 이런 코드 또한 괜찮은 코드라는 생각이 든다. 혹시 pair에 대한 sort()가 어떤식으로 적용받는지 완벽하게 이해하지 못하건,
혹은 특별한 compare() 함수를 만들어서 전달해야하는데, 잘 생각이 나지 않을때( pair 에 대하여) 이렇게 pair를 이용하지 않는 풀이를 하는것도 좋을것 같다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 대문자와 소문자 (0) | 2023.09.25 |
---|---|
Lv 0. 암호 해독 (0) | 2023.09.25 |
Lv 0. 삼각형의 완성조건 (1) (0) | 2023.09.24 |
Lv 0. 중복된 문자 제거 (0) | 2023.09.24 |
Lv 0. 배열 원소의 길이 (0) | 2023.09.24 |