Algorithm

백준 14889번 스타트와 링크 (DFS)

알로그 2020. 1. 12. 17:29
반응형

DFS를 이용하여 백준 문제를 풀어보자.

 

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

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

 


기존에는 맵 형태의 탐색을 하기 위한 DFS방식만 알고 있었는데, DFS를 백트래킹을 이용하여 탐색하는 방식으로 구현할 수 있다는 것을 처음 알게 해 준 문제이다.

DFS, 백트래킹을 이용해서 팀을 나눠서 능력치의 합을 구하는 문제이다.

또는 순열을 이용해서 팀을 나눈 뒤, 능력치의 합을 구할 수도 있다. 

딱히 설명할 부분은 없으며 DFS와 백트래킹을 이용하는 방법(값을 호출하면서 따라 가보는 것을 추천)만 이해하면 된다.

 

 

<소스코드>

#include<iostream>

using namespace std;

int n;
int S[21][21];
int checked[21];
int ans = 0xfffffff;

void dfs(int idx, int cnt) {
	if (cnt == n / 2) {
		int start = 0, link = 0;

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (checked[i] && checked[j])  start += S[i][j];
				if (!checked[i] && !checked[j]) link += S[i][j];
			}
		}

		int temp = abs(start - link);
		if (ans > temp) ans = temp;
		return;
	}

	for (int i = idx; i < n; i++) {
		checked[i] = true;
		dfs(i + 1, cnt + 1);
		checked[i] = false;
	}
}

int main(void) {
	cin >> n;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> S[i][j];
		}
	}

	dfs(0, 0);

	cout << ans << '\n';
	return 0;
}

 

 

순열을 이용하는 방식을 알고싶은 분들은 아래 문제를 참조하면 도움이 될 것이다.

https://hungc.tistory.com/70

 

[Brute-Force] 15686번 치킨배달

https://www.acmicpc.net/problem/15686 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)..

hungc.tistory.com

 

반응형

'Algorithm' 카테고리의 다른 글

백준 17144번 미세먼지 안녕! (BFS)  (0) 2020.01.13
백준 14502번 연구소 (BFS)  (0) 2020.01.12
백준 1463번 1로 만들기 (DP)  (0) 2020.01.12
백준 2579번 계단 오르기 (DP)  (0) 2020.01.12
백준 2747번 피보나치 수 (DP)  (0) 2020.01.12