[알고리즘] 문제풀이 연습

백준 3052 - 나머지 : [c++ STL] set 이용

ddgoori 2019. 7. 2. 17:31

- 입력받을 배열을 공간을 선언한다.

- 입력받은 배열을 for문을 통해서 %42 해준다.

- %42한 값은 set container에 넣어준다.

이때, set container는 중복 값을 받지 않기 때문에 나머지 중 같은 수는(이미 담긴 수) 제외되고 담긴다

- set container의 size를 구하면 담긴 원소 개수를 알 수 있다.

 

=> 10개의 값을 각 %42를 한 후, 나머지 값들 중 중복을 제외한 서로 다른 값의 나머지 개수만 구하기

 

 

// BJ 3052
#include <iostream>
#include <set>
using namespace std;

int main(void) {

	int array[10];
	int count = 0;

	for (int i = 0; i < 10; i++) {
		cin >> array[i];
	}

	set<int> remainder;//set 중복허용X

	for (int i = 0; i < 10; i++) {
		remainder.insert(array[i] % 42);
	}

	//같지 않은 수 인쇄
	cout << remainder.size();
	return 0;
}

 

[STL] set 정리

 

set container

 

- 연관 컨테이너 중 하나

- 노드 기반 컨테이너, 이진 트리로 구현

- key라 불리는 원소들의 집합

- key값은 중복 허용 안됨

- 원소가 insert 멤버 함수에 의해 삽입되면, 원소는 자동으로 정렬됨 (default 정렬 : 오름차순)

 

헤더 파일

 

- #include <set>

- using namespace std;

- 선언 방법 : set<int> s  -------> set<데이터타입> 변수이름

 

예시

 

- set<int> s;

- s.begin(); 

첫 번째 원소 리턴

- s.end();

마지막 원소 리턴

- s.clear();

모든 원소 제거

- s.count(k)  -------> int k는 원소임

원소 k의 개수 반환 (** set에서는 중복이 불가능하기 때문에 0,1 임.)

다만, multiset에서는 키값이 중복 가능하기 때문에 거기서 쓰임

- s.empty();

set s가 비워져 있는지 확인

- s.insert(k);

원소 k 삽입

삽입시 자동으로 정렬된 위치에 삽입됨

삽입이 성공 여부는 pair<iterator, bool>으로 나오게 됨

- s.insert(iter, k);

iter가 가리키는 위치부터 k를 삽입할 위치를 탐색하여 삽입

- s.erase(iter);

iter가 가리키는 원소 제거

- s.erase(start, end);

stat~end 범위의 원소 모두 제거

- s.find(k)

원소 k를 가리키는 반복자 반환

- s.size();

s의 원소 개수를 반환

- s.max_size();

s의 최대 남은 메모리 크기를 반환