park780172   4년 전

저는 Union-Find로 접근하였습니다.

점(섬)의 개수가 N개 이고,

입력하는 다리의 개수가 (N - 2)개 입니다.

O----O----O----O     O
1      2     3     4      5

O----O----O     O----O
1      2     3     4      5

.
.
.

O     O----O----O----O
1      2     3      4     5

등등

위에 처럼 어떤 i번 째 섬과 (i + 1)번 째 섬

연결되어 있지 않은 경우가 무조건 존재하니,

이런 경우가 존재하면 바로 종료하도록 return 하였습니다.

제가 어떤 부분에 있어서 잘못 접근하고 있는지 궁금합니다!

solveit   4년 전

트리 루트를 비교해야 하기 때문에 parent[i] 대신 getParent(i)를 쓰셔야 하지 않을까요?

park780172   4년 전

@solveit

우선 댓글 감사합니다.

solveit님의 질문이 잘 이해 되지 않습니다.

말씀하신 parent[i]가 38번 째 줄에 있는 것을 말씀하시는 건가요?

parent[a] = b는 'a의 부모 노드(루트 노드)가 b(최솟값)'이기 때문에

한 그룹(소속)이면, 부모 노드(=루트 노드)가 같음을 이용했습니다.

solveit   4년 전

두 노드가 같은 그룹일때 루트 노드는 같겠지만 꼭 부모 노드까지 같지는 않습니다.

parent[i]는 노드 i의 부모 노드고 getParent(i)는 i가 속해있는 그룹의 루트 노드이기 때문에 다른 결과가 나오겠죠.

solveit   4년 전

일단 똑같은 코드에서 parent[i] ==> getParent(i) (parent[i + 1] ==> getParent(i + 1)) 로만 바꾸고 제출했더니 통과했습니다.

park780172   4년 전

@solveit

5
2 3
4 5
3 5

위를 실행시켜보면, 아래와 같은 상황이 나오네요.

parent[1] = 1, getParent(1) = 1
parent[2] = 2, getParent(2) = 2
parent[3] = 2, getParent(3) = 2
parent[4] = 2, getParent(4) = 2
parent[5] = 4, getParent(5) = 2

자신의 '부모 노드'에 대한 '값'을 바꿔주는 것이니(parent[부모]),

parent[자신]의 값은 그대로인거네요.

감사합니다.

이해 됐습니다.

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