문제
https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
풀이
일반적인 백트래킹 문제이다.
n개 중에서 m개를 뽑는 조합이라고 가정하였을때 n은 각 tc마다 바뀌는 vector의 크기가 되고, m은 6개로 고정이다. 이를 바탕으로 조합을 돌려 모든 경우의 수를 출력하면 된다. lotto와 isused를 초기화하는 것을 잊지말자.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
vector<int> lotto;
bool isused[14];
void reset()
{
memset(isused, false, sizeof(isused));
lotto.clear();
}
void func(int idx, int cnt)
{
if (cnt == 6)
{
for (int i = 0; i < lotto.size(); i++)
{
if (isused[i])
{
cout << lotto[i] << " ";
}
}
cout << "\n";
return;
}
for (int i = idx; i < lotto.size(); i++)
{
if (!isused[i])
{
isused[i] = true;
func(i + 1, cnt + 1);
isused[i] = false;
}
}
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
while (true)
{
int size;
cin >> size;
if (size == 0)
{
return 0;
}
for (int i = 0; i < size; i++)
{
int a;
cin >> a;
lotto.push_back(a);
}
func(0, 0);
cout << "\n";
reset();
}
}
'BOJ' 카테고리의 다른 글
[BOJ] 백준 14888번 연산자 끼워넣기 C++(삼성 기출문제) (0) | 2022.04.01 |
---|---|
[BOJ] 백준 1759번 암호 만들기 C++ (0) | 2022.04.01 |
[BOJ] 백준 14889번 스타트와 링크 C++(삼성 기출문제) (0) | 2022.03.31 |
[BOJ] 백준 9663번 N-Queen C++ (0) | 2022.03.30 |
[BOJ] 백준 16234번 인구 이동 C++(삼성 기출문제) (0) | 2022.03.28 |