백준/탐색

백준 6603 c++ "로또" -PlusUltraCode-

PlusUltraCode 2025. 5. 27. 16:36

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

 

[필자 사고]

정해진 집합내에서 부분집합을 구해야 하는 문제이다.

또한 정해진 정렬을 기준으로 뽑아야 한다.

필자는 조합을 생각해냈따. 

DFS를 이용하여 백트래킹을 이용하여 해당 알고리즘을 구현했다.

 

아래는 자세한 코드 해설이다.

[코드 해설]

✅ main() 함수

  • 무한 루프를 돌면서 사용자로부터 입력을 받는다.
  • num이 0이면 종료 (break)
  • 아닌 경우 Game_Start(num)를 호출해 num개의 숫자를 입력받고 조합을 계산
  • 각 조합 블록 뒤에는 줄바꿈 출력

✅ Game_Start(int N) 함수

  • 입력받은 숫자 N개를 arr 벡터에 저장하고 오름차순 정렬한다.
  • 조합 결과를 담을 result 벡터를 초기화한다.
  • DFS(0, 0) 호출 → 인덱스 0부터 시작하며 0개 선택된 상태

✅ DFS(int idx, int size) 함수

  • 백트래킹을 통해 arr에서 6개의 숫자 조합을 생성
  • size == 6이면, result 벡터에 저장된 6개 숫자를 출력하고 리턴
  • 그렇지 않으면 idx부터 arr.size()까지 반복하면서:
    • 현재 숫자를 result에 추가
    • 다음 인덱스(i+1)부터 다시 DFS 호출 (중복 방지)
    • 재귀가 끝나면 마지막 요소를 제거 (pop_back) → 백트래킹 핵심

[소스 코드]

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

vector<int> arr;
vector<int> result;

void DFS(int idx,int size) {
	if (size == 6) {
		for (int i = 0; i < 6; i++) {
			cout << result[i] << " ";
		}
		cout << "\n";
		return;
	}

	for (int i = idx; i < arr.size(); i++) {
		result.push_back(arr[i]);
		DFS(i + 1, size + 1);
		result.pop_back();
	}
}

void Game_Start(int N) {
	arr.clear();
	result.clear();
	for (int i = 0; i < N; i++) {
		int num;
		cin >> num;
		arr.push_back(num);
	}
	sort(arr.begin(), arr.end());
	DFS(0, 0);
}

int main(void) {
	while (1) {
		int num;
		cin >> num;
		if (num == 0)break;
		Game_Start(num);
		cout << "\n";
	}
}