kth990303   2년 전

유니온 파인드를 이용해 상하좌우 결합할 때,

merge 함수에서 최소값을 가진 좌표로 갱신할 수 있도록, 값이 같다면 visit이 더 작은(더 오래된) 좌표로 갱신할 수 있도록 코드를 짰습니다.

반례나 틀린 점을 찾습니다. 아예 알고리즘이 틀렸을 가능성도 있을 것 같긴 합니다만... ㅠㅠ

감사합니다.

littlesam95   2년 전

혹시 푸셨으면 죄송합니다.

num과 nnum이 이미 묶여 있는 상황에서 높이의 최솟값을 비교할 때

d[num] < d[nnum]이 아니라 d[num] < d[find(nnum)]으로 해야 할 것 같습니다.

그룹에서 가장 높이가 낮고 비가 내린 지 오래 된 칸을 parent로 기록하고 num을 parent의 높이와 비가 내린 시간과 비교해야 하는데

형님이 작성하신 코드는  num을 parent의 높이와 비가 내린 시간과 비교하지 않는 것 같아서 말씀드립니다..

2차원 배열로 해결하려 했다가 덕분에 1차원 배열로 변경해서 해결했습니다 감사합니다!

kth990303   2년 전

답변 감사합니다.
다만 nnum 부분을 수정해도 잘 안되네요 ㅜㅜ 바꾼 제 코드를 올려드릴테니, 혹시나 틀린 점이 보인다면 한번 체크해주시면 감사하겠습니다 (다만, 이 작업이 여간 귀찮은 게 아닐테니 패스하셔도 괜찮습니다 :)

나중에 각잡고 다시 한 번 풀어봐야겠어요.

제 질문글 관심있게 봐주셔서 다시 한 번 감사드립니다!

littlesam95   2년 전

음 제 얕은 지식으로는 잘 모르겠지만

merge하는 부분에서 조건문이 약간 이상한 것 같기도 한데...

if (d[a] > d[b])
swap(a, b);
else if (vis[a] > vis[b]) <- 여기서 d[a]가 d[b]와 같은 경우만 비가 내린 시간을 따지는 건데, 조건문이 이렇게 된다면 d[a] < d[b]인 경우에도 비가 내린 시간을 따지게 되지 않나요?
swap(a, b);

제가 맞게 생각한 건지 모르겠습니다ㅠ

kth990303   2년 전

오잉 그러네요.

그 부분만 추가하니까 AC를 받네요

덕분에 맞았어요ㅋㅋㅋ 
코드 신경써서 봐주셔서 감사드립니다!

kth990303   2년 전

원래 코드에서도 merge 하는 부분을 조금 수정하니까 제대로 ac를 받는 걸 확인했습니다!

맨처음 코드에서 merge하는 과정에서 nnum 자체가 find함수를 돌기 때문에 parent를 찾아간 상태에서 비교를 하는 거여서 d[find(nnum)]으로 안해도 돌아가는 것 같아요.

merge 함수에서 알고리즘 실수가 있었네요 다시 한 번 관심있게 코드 봐주셔서 감사드립니다 :)

littlesam95   2년 전

아하 그렇군요 감사합니다! 저도 덕분에 많이 배웠습니다

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