Algorithm/백준

[백준/Python] 스타트와 링크

poppy 2021. 9. 18. 13:22
반응형

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

import sys

n = int(sys.stdin.readline()) # 사람 수
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] # 능력치 리스트
visited = [False] * n # 방문 여부 리스트
answer = 1e9 # 능력치 차이의 최소값

# DFS 수행 
def dfs(depth, now):
	global answer
	
	if depth == n // 2: # 팀 나누기가 끝났다면
		start, link =  0, 0
		
        # 스타트와 링크의 능력치 계산
		for i in range(n):
			for j in range(n):
				if visited[i] and visited[j]:
					start += graph[i][j]
				elif not visited[i] and not visited[j]:
					link += graph[i][j]

		answer = min(answer, abs(start - link)) # 능력치 차이의 최소값 갱신
					
    # 현재 노드의 인접 노드를 아직 방문하지 않았다면 DFS 수행
	for i in range(now, n):
		if not visited[i]:
			visited[i] = True
			dfs(depth + 1, i)
			visited[i] = False

dfs(0, 0)
print(answer)

1. 필요한 정보 입력 받는다

2. DFS를 수행한

    2-1. 현재 탐색하는 노드의 방문을 True로 바꾼다

    2-2. 현재 탐색하는 노드의 인접 노드 중 아직 방문하지 않은 노드를 탐색한다 (DFS 수행)

    2-3. 팀 나누기가 끝났다면 (더 이상 탐색할 노드가 없는 경우) 스타트와 링크의 능력치를 계산하여 능력치 차이의 최소값을 구한다

    2-4. DFS 수행이 끝나면 현재 탐색하는 노드의 방문을 False 로 바꾼다

3. 답을 출력한다

    

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 스도쿠  (0) 2021.09.21
[백준/Python] N-Queen  (0) 2021.09.20
[백준/Python] 연산자 끼워넣기  (0) 2021.09.17
[백준/Python] 좌표 압축  (0) 2021.09.08
[백준/Python] 단어 정렬  (0) 2021.09.06