16964:스페셜 저지
in PS on Ps
문제
코드
틀린 풀이(나)
N=int(input(""))
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
a,b=map(int,input().split())
graph[a].append(b)
graph[b].append(a)
order=list(map(int,input().split()))
check=[]
j=0
n=len(order)
check.append(order[0])
while j<n:
k=0
#for k in range(len(graph[order[j]])):
while k <len(graph[order[j]]):
#print(check)
if graph[order[j]][k] in check:
graph[order[j]].remove(graph[order[j]][k])
k-=1
k+=1
if len(graph[order[j]])==0:
order.remove(order[j])
j-=1
if j<0:
print(1)
break
continue
if order[j+1] in graph[order[j]]:
graph[order[j]].remove(order[j+1])
check.append(order[j+1])
j+=1
else:
print(0)
break
- 인접행렬을 만든 후 방문 순서대로 행렬에 접근
- 다음 방문할 노드가 인접행렬 안에 있는지 없는지 확인하는 방식으로 해봤음
- 방문한 노드를 제거하는과정에서 while 탐색문에 시간초과가 걸리는 듯 하다…
다른사람 풀이
import sys
from collections import deque
sys.setrecursionlimit(100000)
def dfs(graph, visited, cmp, start):
tmp = cmp.popleft()
if not cmp:
print(1)
exit(0)
visited[tmp] = True
for i in range(len(graph[tmp])):
if cmp[0] in graph[tmp] and not visited[cmp[0]]:
dfs(graph, visited, cmp, cmp[0])
return False
N = int(sys.stdin.readline())
visited = [False] * (N + 1)
graph = [[] for _ in range(N + 1)]
for i in range(1, N):
x, y = map(int, sys.stdin.readline().split())
graph[x].append(y)
graph[y].append(x)
cmp = deque(map(int, sys.stdin.readline().split()))
if cmp[0] != 1:
print(0)
exit(0)
if not dfs(graph, visited, cmp, 1):
print(0)
- 입력받은 순서가 올바른지 확인하기위해 queue를 활용하여 검증하는 방법
- 방문 순서대로 적용시켜보며 가능한 방문순서의 경우의 수를 다 따지지 않아 좋은것 같다.
후기
- 시간초과가 날 것을 좀더 고려하고 코드를 짜야겠다.