dfs 18

[Python] 10971. 외판원 순회 2

n = int(input()) # 도시의 수 cost = [list(map(int, input().split())) for _ in range(n)] # 비용 행렬 visited = [False for _ in range(n)] # 도시 방문 리스트 (모든 도시를 방문해야 함) answer = 1e9 # 최소 비용이므로 정답 크게크게 def dfs(s, now, total): global answer if answer < total: # 가지치기 return # 이미 비용이 기존에 저장한 순회 경로 비용보다 커졌다면 돌아가 if s == now and False not in visited: # 모든 도시를 방문했고, 시작지점으로 돌아왔다면 if total < answer: # 최소 비용으로 갱신 answ..

Algorithm/Baekjoon 2022.01.15

[Python] 9663. N-Queen

def dfs(cnt): # cnt => 행 global answer if cnt == n: # 모든 체스를 다 두었다면 answer += 1 return for i in range(n): if visited[i]: # 해당 열에 체스 이미 있다면 패스 continue idx[cnt] = i # 없으면 해당 열에 체스 놓기 for j in range(cnt): # 대각선 체크 # 대각선의 경우 두 좌표에서 행 - 행 = 열 - 열이 같으면 두개는 같은 대각선상에 있다 if (idx[cnt] - cnt) == (idx[j] - j) or (idx[cnt] + cnt) == (idx[j] + j): break else: visited[i] = True # 현재 열 방문처리 dfs(cnt + 1) # 다음 행..

Algorithm/Baekjoon 2022.01.14

[Python] 2814. 최장경로

def dfs(node, cnt): global answer if answer < cnt: # 더 많은 경로 갔다면 갱신 answer = cnt for next in adj[node]: # node와 연결된 노드 중에 if visited[next]: # 방문한적 있다면 패스 continue visited[node] = True # 방문처리 dfs(next, cnt+1) # 다음노드로 가 visited[next] = False # 방문처리 해제 tc = int(input()) for idx in range(1, tc+1): n, m = map(int, input().split()) adj = [[] for _ in range(n+1)] # 인접 리스트 for _ in range(m): x, y = map(..

[Python] 5174. subtree

후위 순회 풀이 # 후위 순회 알고리즘 / 어떤 순회를 써도 상관 X def postorder(n): global answer if n: postorder(left[n]) postorder(right[n]) answer += 1 tc = int(input()) for idx in range(1, tc+1): e, n = map(int, input().split()) # 간선의 개수 e, 시작 노드 n node = list(map(int, input().split())) # 노드 연결 정보 받아오기 left = [0 for _ in range(e+2)] # 부모를 인덱스로 자식번호 저장 right = [0 for _ in range(e+2)] for i in range(0, e*2, 2): p, c = n..

[Python] 4881. 배열 최소합

# 배열 선택 함수 (진행할 행, 이전까지의 선택 숫자들의 합) def select(y, temp_sum): global min_sum # 행의 맨 마지막까지 갔을 경우 (더이상 갈 곳 없으면) if y == n: # 만약 여태 더한 값이 min_sum에 저장되어 있는 값보다 작다면 갱신하고 돌아가기 if temp_sum < min_sum: min_sum = temp_sum return # 여태 더한 값이 이미 min_sum에 저장되어있는 값보다 크다면 들어갈 필요 없어 돌아가 if min_sum