본문 바로가기
Algorithm/개념정리

[개념정리] 조합(Combination) 직접 구현해보기

by 젊은오리 2022. 9. 6.
728x90

아래의 [백준] 14052번 문제를 풀다가 개념을 정리해보았다.

https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

 

주어진 숫자들에 대해서 조합을 하고, 조합된 숫자들에 대해서 문제를 풀어나가야 하는 상황에서 

STL을 사용해서 문제를 풀자니 코드 재활용이 안되고, 과정이 머릿속에서 그려지지 않을 것 같아서 

c++코드로 조합(Combination)을 구현해보았다. 

 

문제 상황

(1,4), (5,2), (9,4), (8,3) ... 와 같이 두개의 숫자로 이루어진 숫자쌍이 여러개 존재하는데, 이 중에서 딱 3쌍을 골라서

문제 풀이를 하는것. 

 

풀이 과정

모든 숫자 쌍을 vector<pair<int,int>> v;를 통해 v라는 벡터에 집어 넣었고, 

3쌍의 조합이 완성될 때마다 저장할 벡터를 vector<pair<int,int>> comb(3);을 통해서 comb이라는 벡터에 집어넣었다.

combination(v, comb, 3, 0, 0);을 통해서 직접 만든 함수 combination()를 호출했고, combination에서는 다음과 같이 동작한다.

여기서 3은 3개를 뽑는다는 의미이고, 첫번째 0은 조합 comb의 index, 두번째 0은 뽑을 원소를 선택하기 위해 v를 순회하는 index이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
void combination(vector<pair<intint>> v, vector<pair<int,int>> comb, int r, int index, int depth)
{
    if (r == 0)
    {
        //조합이 완성되면 수행할 코드
    }
    else if (depth == v.size()) // 계속 안뽑다가 r개를 채우지 못한 경우 --> 버린다.
    {
        return;
    }
    else
    {
        comb[index] = v[depth];
 
        // v[depth] 원소를 뽑는 경우
        combination(v, comb, r - 1, index + 1, depth + 1);
        
        // v[depth] 원소를 뽑지 않는 경우
        combination(v, comb, r, index, depth + 1);
    }
}
cs

 

728x90

'Algorithm > 개념정리' 카테고리의 다른 글

[개념 정리]10진수를 2진수로 변환하는 방법 정리  (0) 2022.10.27
해시(hash)정리  (0) 2022.10.05

댓글