BOJ 28028 - Custodial Cleanup
그리디하게 가장 많은 키를 번에서 시작해 모아보자.
이런 BFS 테크닉은 가끔 나오는데 방문할 수 있는 조건이 동적일 때, 현재 방문할 수 있는건 바로 방문하고 그렇지 않은것은 다른 pending queue에 넣어두었다가 특정 노드에서 어떤 조건이 만족되면 그 조건들에 pending 되어있는 노드들을 다시 큐에 삽입시켜주는 것이다.
번에서 방문될 수 있는 노드들의 집합 외 노드에서 인 경우가 있다면 불가능하다.
그렇지 않다면 다음과 같은 아이디어를 써서 검사한다.
해설 왈, 그리디 알고리즘은 동작하지 않는다고 증명되었다고 한다.
모든 키를 가졌다고 해도 인 것들때문에 항상 모든 노드를 방문할 수 있는건 아니다.
그리고 번에서 시작해서 모두 두고오는 로직을 짜는건 곤란하므로, 역으로 생각하여 첫 BFS에서 방문된 노드들에 모두 로 설정하고 반대로 그것들을 모두 줏어올 수 있는지를 판별한다.
이것이 성립하는 이유는 키들을 모두 두는것과 키들을 모두 줏어오는게 반대로 행동하면 동치이기 때문이다.
다만 두 번째의 BFS에서는 조건을 조금 다르게 가려는 방에 에 해당하는 키가 이미 있거나 인 경우에만 가도록 한다.
왜냐면 두 번째 BFS에서는 에 진입하기 위해 가 필요한게 아니라 에서 나오기 위해 가 필요하기 때문이다.
이걸 좀 더 설명하면, 로 갈 때, 를 현재 키중에 갖고있거나 인지 봐야한다는건 이제 로 가면 현재 가진 키들과 의 키를 원래 과정에서 가지고 있었다는 뜻인데, 그럼 가 있었어야 하므로 를 가기 직전인 에서 (원래 과정에선 이후에 ) 를 가지고 있어야 하거나 라서 에서 키를 쓴 다음 로 온거거나 둘 중 하나여야 한다.
Comments