Algorithm/acmicpc.net

넘쳐나는 아이디어 그리고 떨어지는 구현능력

winney916 2022. 1. 26. 10:49
728x90

#16940번 BFS 스페셜 저지 https://www.acmicpc.net/problem/16940

 

16940번: BFS 스페셜 저지

올바른 순서는 1, 2, 3, 4와  1, 3, 2, 4가 있다.

www.acmicpc.net

층별로 돌면서 그 층에 있는 노드들의 다음층 노드에 속하는지 판단하는 코드를 구현하고 싶었다.

 

하지만 맘처럼 잘 되지 않더라...

N = int(input())
matrix = [[] for _ in range(N+1)]

for i in range(N-1):
    prev, to = map(int, input().split())
    matrix[prev].append(to)
    matrix[to].append(prev)
matrix[0].append(1)


target = list(map(int, input().split()))

queue = [0]
idx = 0
for x in target:
    while x not in matrix[queue[idx]]:
        idx += 1
        if idx == len(queue):
            print(0)
            exit()
    queue.append(x)

print(1)

어제부터 자꾸 골드3 문제에서 쓰러진다... 휴,, 

문제는 이렇게 푼다.

1 2 4 3

의 경우를 생각해보자

 

그래프의 경우에

   1

2,    3

4

 

형태로 구성되어 있다.

1번 노드 위에 0번이 있다고 가정한다. (문제를 해결하기 위해 추가한 층이다)

   0      (0번 층)

   1      (1번 층)

2,    3   (2번 층)

4         (3번 층)

 

그리고 0번 층에 해당하는 0번 노드의 다음층에 있는 노드들에 target의 첫 번째 값(1)이 존재하는지 검토한다.

 

있기 때문에 queue에 1을 넣는다.

 

다음 target은 2이다. 현재 queue에 저장되어 있는 값은 0번 층 전부이다.

0의 연결 노드에는 1 뿐이다. 1은 검토가 끝났으니 1의 다음 층에 해당하는 값들 불러온다. (idx += 1)

이게 while 문의 역할이다.

1에 연결되어있는 노드들에 현재  target인 2가 존재하는지 판단한다.

 

존재한다. 2를 queue에 넣어준다.

 

현재 idx = 1이다. queue = [0, 1, 2] 이므로 1을 지칭하고 있다.

 

다음 target은 4이다. 4는 1의 다음 노드에 존재하지 않는다. idx += 1을 해서

2의 다음 노드를 살펴보게한다. 2의 다음 층에는 4가 존재함으로 queue에 4를 넣어준다

문제는 그 다음이다. 현재 탐색함수는 3층으로 진행했다.

하지만 마지막 수인 3은 3층에 존재하지 않는다.

 

뭐 이런식으로 진행되는 코드이다.

 

내가 짠게 아닌지라 설명이 빈약하다.