shinbian11   3년 전

36~45번째 코드를 하니까 틀렸다 나오고, 그 대신 46~50번째 코드로 대체하니까 맞다고 나오는데, 두 코드 덩어리 모두 집합끼리 합친다 라는 정의는 같지 않나요? disjoint - set 처럼 한 건데 왜 36~45번째 코드는 틀린 건가요? 제가 어떤걸 잘못 구현한건지 궁금합니다.

wider93   3년 전

문제는 안 읽어봤지만 100번 줄에서 ans에 넣는 것이 root[i]들이기 때문에 그럴 것 같네요. 항상 최상단의 노드를 찾도릭 Find(i)로 바꾸면 주석처리한 부분도 작동할 겁니다.

shinbian11   3년 전

오오 그렇네요. 감사합니다!

그런데 왜 저 부분을 Find(i)로 바꿔서 최상단의 노드를 찾아주어야 하나요?

제가 생각했을떈 이미 Union(i,j) 을 통해서 그 작업을 모두 해준것 같아서요.

그럼 그냥 root[i]의 값을 ans에 넣어도 되지 않나요?

반례가 궁금합니다..

shinbian11   3년 전

Union함수에서 이미 부모 노드를 다 찾아서 두 부모노드가 같지 않으면 Rank를 따져서 합쳐주면서 root[i]의 값을 갱신하는 과정을 거쳤는데도 왜 root[i]를 ans에 넣으면 안되는지가 궁금합니다.

wider93   3년 전

부모는 변하니까요. a->b, c->d, b->d 순으로 연결하면 a는 d와 연결되어 있지만 root[a]는 아직 d가 되지 못했습니다.

shinbian11   3년 전

아아 그렇군요! 이제 이해했습니다 ㅎㅎ 감사합니다!

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