728x90

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

 

코딩테스트 연습 - 폰켓몬

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

programmers.co.kr

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums) {
	set<int> s;
	for (int i = 0; i < nums.size(); i++) {
		s.insert(nums[i]);
	}
	if (s.size() <= nums.size() / 2) {
		return s.size();
	}
	else {
		return nums.size() / 2;
	}
}

일단 이렇게 set으로 간단하게 풀었다. vector를 set으로 복사하는 함수를 몰라서 일단 저렇게 for문을 돌려서 풀고나서 vector를 set으로 복사하는 방법을 찾아봤다.

http://www.cplusplus.com/reference/set/set/set/

 

set::set - C++ Reference

range (2)template set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type()); template set (InputIterator first, InputIterator last, const allocator_type& = allocator_type());

www.cplusplus.com

여기에 있는 생성자들 중 range에 해당하는 방법으로 vector의 원소들을 원소로 가지는 set으로 만들 수 있다.

만약 v라는 int 타입의 vector가 있고 그것의 원소들을 원소로 가지는 set s을 만들고 싶다면

set<int> s(v.begin(), v.end());

이렇게 하면 된다.

 

따라서 이 방법을 이용해서 폰켓몬을 풀면 코드가 다음과 같이 더 짧아진다.

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums) {
	set<int> s(nums.begin(), nums.end());
	if (s.size() <= nums.size() / 2) {
		return s.size();
	}
	else {
		return nums.size() / 2;
	}
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 큰 수 만들기  (0) 2020.07.30
[프로그래머스] 땅따먹기  (0) 2020.07.30
[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] N M 찍기  (0) 2020.04.11
[백준] 10815번 숫자 카드  (0) 2020.04.11

+ Recent posts