문제풀이/프로그래머스

[프로그래머스] 폰켓몬

Hyeon-Uk 2021. 5. 31. 17:24
반응형

https://programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr


 

-풀이-

해당 번호의 폰켓몬이 나왔는지 확인 할 수 있는 bool check[200001]을 선언한다. check[i]=true이면 i번 폰켓몬을 종류의 수에 포함시켰다는 것이고, false이면 i번 폰켓몬을 종류의 수에 포함되지 않았다는 것이다.

따라서 nums배열을 돌며, 해당 폰켓몬이 종류의 수에 포함되지 않았다면, 종류의 수를 1 증가시킨 뒤, 해당 check[i]를 true로 설정해준다.

 

이렇게 nums배열에 총 몇종류가 있는지 확인을 한 뒤, 종류의 개수와 N/2를 비교하여, 더 작은 쪽이 가장 많은 종류의 폰켓몬을 선택하는것이 되는것이다.

 

-시간복잡도-

nums의 배열의 길이를 N이라고 한다면, O(N)시간이 된다.

 

-코드-

 

#include <vector>
#include<algorithm>
using namespace std;

bool check[200001]={0};

int solution(vector<int> nums)
{
    int answer = 0;
    int n=nums.size();
    int race=0;
    //종류의 수를 세어주는 for문
    for(int i=0;i<n;i++){
        int now=nums[i];
        if(!check[now]){
            check[now]=true;
            race++;
        }
    }
    //종류의 수와 n/2를 비교하여 더 작은쪽이 최댓값
    answer=min(race,n/2);
    return answer;
}

 

반응형