본문 바로가기
Coding Test/C++

[프로그래머스] 폰켓몬 C++ Code

by giem 2022. 7. 29.
반응형

2022.07.29 - [Coding Test/Python] - [프로그래머스] 폰켓몬 Python 3 Code

 

[프로그래머스] 폰켓몬 Python 3 Code

이번에도 프로그래머스 스쿨 추천 문제 중 하나인 폰켓몬을 풀어보겠다. 문제 예시 Code 구현은 중복을 지우는 set를 써서 포켓몬 종류를 구한 뒤 len과 비교하여 더 작은 것을 정답으로 리턴하게

gm-note.tistory.com

이번엔 C++로 풀이해보겠다.

 


문제

 

 


C++ Unique

 

우선 구현하는데 Python의 set과 비슷한 Unique함수의 사용법이 헷갈려서 찾아보았다.

https://cplusplus.com/reference/algorithm/unique/

위 링크에서 참고하면 된다.

 

c++의 unique는 python의 set과는 달리 그룹으로 묶어서 지워주는 기능이다.

예를 들어 [1,1,2,2,3,3,2,2,1,1] 이렇게 있다면

[1,2,3]이 되는 것이 아니라

[1,2,3,2,1,?,?,?,?,?] 이렇게 된다고 한다.

뒤의 값은 어떻게 출력될지는 모른다.

이후 리턴값은 저 뒤의 ?값이 시작되는 부분을 가리킨다.

 

여기서 [1,2,3,2,1]만 남기고 싶기에 resize로 크기를 변경해야 한다.

이때 위 링크에서는 distance를 사용했다.

 

distance는 시작과 끝부분을 받아서 그 hop 수를 반환하는 함수이다.

 

그래서 set과 같은 동작을 시키기 위해 sort를 한 후

begin과 unique의 반환값을 distance에 넣어 size를 받아 resizing을 했다.


Code

#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> nums)
{
    int answer = 0;
    answer = nums.size()/2;
    sort(nums.begin(), nums.end());
    nums.resize(distance(nums.begin(), unique(nums.begin(), nums.end())));
    #python의 set과 같은 기능

    if( answer > nums.size() )
        return nums.size();

    return answer;
}

 

이후 C++의 STL에도 있다는 말을 듣고 다시 풀어봤다.

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums)
{
    set<int> numset(nums.begin(), nums.end());
    
    if(numset.size() > (nums.size()/2))
        return nums.size()/2;
    
    return numset.size();
}

 

이 문제는 Go언어가 제출이 되지 않아서 JS로 풀어보겠다.

반응형

댓글