백준/탐색

백준 15663 c++ "N과 M (9)" -PlusUltraCode-

PlusUltraCode 2025. 5. 27. 17:49

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

 

[필자 사고]

조합 문제인줄 알았지만 순서가 정해져 있는 문제이다.

조합에서는 DFs인자에 한상 현재 idx 및 size 를 넘겨줬지만

순서가 정해져있으면 idx를 넘기지 않고 size만 넘기면 된다.

 

그후 visited배열을 통해 왔떤 거 방문 처리를 해주고

이미 배열이 정렬되어 있는 상황이니깐 같은 깊이에서 똑같은 숫자를 고르는건 무의미하다.

결국에는 prevData를 이용하여 같은 숫자를 고른거는 방지해주는 장치를 마련하고 문제를 해결한다.

resultArr.push_back() 해주는거랑 resultArr.pop_back() 해주는건 잊지 말자

 

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

[코드 해설]

 

  • Input() 함수
    • 사용자로부터 두 개의 정수 N과 M을 입력받는다.
    • 이어서 N개의 정수를 입력받아 arr 벡터에 저장한다. 이는 사용할 숫자들의 리스트이다.
  • DFS(int depth) 함수
    • 깊이 우선 탐색 방식으로 M개의 수열을 생성한다.
    • 현재 깊이가 M에 도달하면 resultArr에 저장된 수열을 출력한다.
    • 이전에 사용한 수를 추적하여 중복되는 수열이 생성되지 않도록 한다.
    • visited 배열을 사용하여 현재 탐색 경로에서 중복된 원소를 선택하지 않도록 제어한다.
  • Game_Start() 함수
    • arr를 오름차순으로 정렬한다. 이는 중복 수열을 방지하고 사전순 출력을 보장하기 위함이다.
    • visited와 resultArr을 초기화하고, DFS(0)을 호출하여 수열 생성 탐색을 시작한다.
  • main() 함수
    • Input()을 호출하여 입력을 받고,
    • Game_Start()를 호출하여 문제 해결을 수행한다.

 

 

[소스 코드]

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

int N, M;
vector<bool> visited;
vector<int> resultArr;
vector<int> arr;

void Input() {
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int num;
		cin >> num;
		arr.push_back(num);
	}
}

void DFS(int depth) {
	if (depth == M) {
		for (int i = 0; i < resultArr.size(); i++) {
			cout << resultArr[i] << " ";
		}
		cout << '\n';
		return;
	}

	int prevNum = -1;
	for (int i = 0; i < N; i++) {
		if (visited[i])continue;
		if (prevNum == arr[i])continue;
		visited[i] = true;
		resultArr.push_back(arr[i]);
		DFS(depth+1);
		resultArr.pop_back();
		visited[i] = false;
		prevNum = arr[i];

	}
}

void Game_Start() {
	sort(arr.begin(), arr.end());
	visited.clear();
	resultArr.clear();
	visited.resize(N, false);
	DFS(0);

}

int main(void) {
	Input();
	Game_Start();
}