πŸ˜‰/μ½”λ”©ν…ŒμŠ€νŠΈ

[μ•Œκ³ λ¦¬μ¦˜] 완전탐색(PICNIC)

ruhz 2020. 7. 28. 16:38
 

algospot.com :: PICNIC

μ†Œν’ 문제 정보 문제 μ•ˆλ“œλ‘œλ©”λ‹€ μœ μΉ˜μ› μ΅μŠ€ν”„λ ˆμŠ€λ°˜μ—μ„œλŠ” λ‹€μŒ 주에 μœ¨λ™κ³΅μ›μœΌλ‘œ μ†Œν’μ„ κ°‘λ‹ˆλ‹€. 원석 μ„ μƒλ‹˜μ€ μ†Œν’ λ•Œ 학생듀을 두 λͺ…μ”© 짝을 지어 ν–‰λ™ν•˜κ²Œ ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 그런데 μ„œλ‘œ

www.algospot.com

#include <iostream>
#include <queue>
using namespace std;
queue<int> answer;

// matrix에 친ꡬ 관계, paired에 μΉœκ΅¬κ°€ μžˆλŠ”μ§€ μ—¬λΆ€ μ €μž₯
int matrix[10][10];
int paired[10];
int student_num, pair_num;

int makePair() {
	// 짝이 μ—†λŠ” 학생이 μžˆλ‹€λ©΄ idx에 μ €μž₯ν•˜κ³ , λͺ¨λ‘ 짝이 μžˆλ‹€λ©΄ 1을 λ°˜ν™˜
	int idx = -1;
	for (int i = 0; i < student_num; i++)
		if (paired[i] == -1) {
			idx = i;
			break;
		}
	if (idx == -1) return 1;

	// 짝이 μ—†κ³ , 친ꡬ인 학생을 μ°Ύμ•˜λ‹€λ©΄ μ—°κ²°μ‹œν‚€κ³  μž¬κ·€ 호좜
	int result = 0;
	for (int i = idx + 1; i < student_num; i++)
		if (paired[i] == -1 && matrix[idx][i] == 1) {
			paired[idx] = 1;
			paired[i] = 1;
			result += makePair();
			// ν•΄λ‹Ή ν•¨μˆ˜κ°€ λ°”κΎΌ 배열을 μ›λž˜λŒ€λ‘œ 되돌리며 λ°˜ν™˜
			paired[idx] = -1; 
			paired[i] = -1;
		}
	return result;
}

int main() {
	int t;
	cin >> t;
	while (t > 0) {
		cin >> student_num >> pair_num;
		for (int i = 0; i < 10; i++) {
			paired[i] = -1;
			for (int j = 0; j < 10; j++)
				matrix[i][j] = -1;
		}
		for (int i = 0; i < pair_num; i++){
			int a, b;
			cin >> a >> b;
			matrix[a][b] = 1;
			matrix[b][a] = 1;
		}
		answer.push(makePair(n));
		t--;
	}

	while (!answer.empty()) {
		cout << answer.front() << endl;
		answer.pop();
	}

	return 0;
}

예λ₯Ό λ“€μ–΄ makePair ν•¨μˆ˜ A1이 A2, A3λ₯Ό μ°¨λ‘€λŒ€λ‘œ ν˜ΈμΆœν–ˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

 

​A2와 그것이 μž¬κ·€ν˜ΈμΆœν•œ ν•¨μˆ˜λ“€μ΄ paired[]의 값을 λ³€κ²½ν–ˆμ„ 것이닀. ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ paired[]κ°€ μ „μ—­λ³€μˆ˜ μ΄λ―€λ‘œ, A2 κ°€ 값을 λ°˜ν™˜ν•˜κ³  A3κ°€ 호좜 될 λ•ŒλŠ”, A1μƒνƒœμ—μ„œμ˜ paired[]κ°€ μ•„λ‹Œ A2 κ°€ λͺ½λ•… 뒀지며 κ°ˆμ•„ μ—Žμ€ paired[]κ°€ 있게 λœλ‹€. λ”°λΌμ„œ A2 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λ©° μžμ‹ μ΄ λ³€κ²½ν•œ 값을 μ›λž˜λŒ€λ‘œ λ‹€μ‹œ 고쳐야 함을 μ•Œ 수 μžˆλ‹€.

 

이 λ•Œ ν•¨μˆ˜ μ½”λ“œμ— "λ³€κ²½ >> μž¬κ·€ 호좜 >> 원상 볡귀" 의 νŒ¨ν„΄μ„ λ„£μœΌλ©΄, μž¬κ·€κ°€ 깊이 λ“€μ–΄κ°”λ‹€ λ‚˜μ™€λ„ λ‹€μ‹œ μ•Œλ§žμ€ μ‹œμ μ—μ„œ μž¬κ·€νƒμƒ‰μ„ ν•  수 μžˆλ‹€.

 

​※ paired[] 을 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ 전달해 κ΅¬ν˜„ν•˜λ©΄ μœ„ 문제λ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ 될 것이닀.

 

 

 

ruhz3/CodingTest

To prepare for coding test. Contribute to ruhz3/CodingTest development by creating an account on GitHub.

github.com