착신 전환 소동
면접 대비시간 제한1초메모리 제한1024 MB
각 전화의 착신 전환 대상이 주어질 때, 모든 전화가 두 대 이상으로 이루어진 순환에 빠지도록 바꿀 설정의 최소 개수와 새 설정을 구합니다.
문제
도훈이네 부대의 전화기에는 착신 전환이라는 기능이 있다. 착신 전환은 전화기에 걸려 오는 전화를 다른 전화기로 대신 연결하는 기능이다. 가령 전화기 가 전화기 로 착신 전환을 했다면, 전화기 에 전화를 걸었을 때 전화기 에 전화가 걸려 온다. 전화기마다 착신 전환은 최대 하나의 전화기로만 설정할 수 있다.
이 기능에는 큰 문제가 있다. 착신 전환이 순환을 이루면 일부 전화기가 먹통이 된다. 예를 들어 전화기 가 로, 가 로, 가 로 착신 전환을 걸어 두면, 세 전화기 중 어느 것에 전화를 걸어도 신호 대기 상태가 무한히 유지되고 세 전화기 모두 먹통이 된다.
이 사실에 깊은 인상을 받은 도훈이는 일부 전화기의 착신 전환 상태를 바꿔 부대 내 전화기를 모두 먹통으로 만들려는 계획을 세웠다. 부대에는 번부터 번까지 대의 전화기가 있으며, 전화기 는 현재 번 전화기로 착신 전환이 되어 있다. 라면 전화기 에는 착신 전환이 걸려 있지 않다.
착신 전환 상태를 너무 많이 바꾸면 간부님께 걸릴 것이 분명하므로, 상태를 바꿀 전화기 수는 최소여야 한다. 상태를 바꿔야 하는 최소 전화기 수와 바뀐 착신 전환 상태를 구하라. 가능한 상태가 여러 가지라면 그중 아무거나 구해도 된다. 모든 전화를 먹통으로 만드는 것이 항상 가능함을 증명할 수 있다.
입력
첫 번째 줄에 부대 내 전화기의 대수 이 주어진다. ()
두 번째 줄에 각 전화기가 착신 전환으로 연결된 전화기의 번호를 뜻하는 정수 이 공백으로 구분되어 주어진다. ()
이면 번 전화기에는 착신 전환이 걸려 있지 않다.
출력
첫 번째 줄에 모든 전화를 먹통으로 만들기 위해 착신 전환 상태를 바꿔야 하는 최소 전화기 수를 출력한다.
두 번째 줄에 착신 전환 상태를 바꾼 뒤 각 전화기의 상태를 뜻하는 정수 을 출력한다. 가능한 상태가 여러 가지라면 그중 아무거나 출력한다.