16964:스페셜 저지

문제

image


코드

틀린 풀이(나)

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를 활용하여 검증하는 방법
  • 방문 순서대로 적용시켜보며 가능한 방문순서의 경우의 수를 다 따지지 않아 좋은것 같다.

후기

  • 시간초과가 날 것을 좀더 고려하고 코드를 짜야겠다.




© 2021.11. by zziny

Powered by zziny