shwjdgh3842   2년 전

발상은 다음과 같습니다.

우선 진실을 알고 있는 사람을 벡터에 저장한 다음 원소들을 모두 marge합니다. (이때 기준을 0으로 해서 0과 루트가 같으면 진실을 알고있다고 판단할 수 있습니다.)

파티에 참여하는 사람 중 진실을 아는 사람이 있다면 그 파티 참여인원 모두를 0과 marge합니다.

그리고 진실을 말할 수 있는 파티인지 탐색하여 답을 도출합니다.

로직이 잘못된걸까요? 아님 구현에서 미스가 있는걸까요

68~74 주석을 해제하면 해결되는데 도대체 어떤 반례때문에 주석문이 추가되어야하는지 모르겠습니다

도움 부탁드립니다 ㅠ

recoma   2년 전

98 라인에서 새롭게 묶인 사람이 있어, 한번 더 돌아도, 다시 새롭게 묶인 사람이 존재합니다. 새롭게 묶였음에도 불구하고 체크를 못했기 때문에 오답을 출력합니다.

68 ~ 74 라인에서는 이러한 경우를 미리 처리를 해 두었기 때문에 정답 처리가 될 수 있었습니다.

반례를 예로 들면 [1,2,3], [4,5,6], [6,7,8], [3,8] 이 있고, 진실을 아는 사람이 [1] 일 때 84 라인을 작동시키면 [1,2,3]과 [3,8]이 묶이게 되어 [1,2,3,8], [4,5,6], [6,7,8]이 됩니다. 그리고 98라인에 의해 [1,2,3,8]과 [6,7,8]에 [8]이 공통으로 포함되어 있으므로 [1,2,3,6,7,8], [4,5,6]이 됩니다. 따라서 주석 처리할 경우에 대한 출력은 [4,5,6]으로 1이 되지만. 나머지 두 집합에는 [6]이 공통으로 들어가 있기 때문에([1,2,3,4,5,6,7,8]), 6도 진실을 알게 되므로, 실제 정답은 0이 됩니다.

반면, 68 ~ 74 라인을 주석 해제하게 되면 같은 파티원 끼리 한 집합으로 묶이게 되는데, 이 과정에서 모든 파티([1,2,3], [4,5,6], [6,7,8], [3,8])들이 하나로 묶여, 84라인으로 본 작업을 시작했을 때 이미 [1,2,3,4,5,6,7,8]로 전부 묶여 있으므로 0을 출력하게 됩니다.

댓글을 작성하려면 로그인해야 합니다.