nlkey2022   5년 전

가장 가장자리 if (i == 1 || j == 1 || i == h || j == w)

부분은 무조건 웅덩이가 아닌것을 감안하면 

웅덩이가 아닌 지역과 인접한 부분 중에 보다 높거나 같은 지역은 무조건 웅덩이가 아니므로 a[here.first][here.second] <= a[nx][ny]

bfs로 생각했으나..

9 12

5 5 5 5 5 5 5 5 5

5 2 2 2 2 2 2 2 5

5 2 9 9 9 9 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 6 6 6 9 2 5

5 2 9 9 9 9 9 2 5

5 2 2 2 2 2 2 2 5

5 5 5 5 5 5 5 5 5

이러한 반례가 있네요.. (웅덩이 안에 웅덩이)

어떻게 접근해야할지 모르겠습니다

atomzeno   5년 전

그냥 union find 인 것 같네용...조금만 더 생각을!!

nlkey2022   5년 전

@atomzeno 그냥 유니온 파인드는 아닌거 같아요 ㅠㅠ 탐색하는 방법이 너무 어려운데

nlkey2022   5년 전

좀더 힌트 좀 주실수 있나요???

atomzeno   5년 전

댓을 늦게 봤네용..

높이가 K일 때, 웅덩이를 판별하

는 것을 높이가 K-1일때 했던 것으로 커버할 수 있을까요?

이것이 UNION_FIND라고 생각한 이유는, 높이가 K-1일때 웅덩이들을 알아 두면, 그것을 높이가 K일 때로 확장하는데 쓸 수 있기 때문입니다 

예제에서

b1336bc5-1d5a-4804-a817-166d094c26cd

K=3일 때는 위와 같이 되는데, 이를 K=4로 확장하면

bd43a6df-0da6-4ebf-9383-e8661d8b02ef

즉, 칸중에서 높이가 4인 부분을 이전에 묶어주었던 것에 추가해주면 됩니다. 

기본적으로 이 아이디어를 사용해주면 됩니다. 

주의할 것은 노란색으로 묶은 부분이 웅덩이일 조건이 (밖의 테두리 부분에 칸들을 포함하지 않는것 OR 0인 원소와 이웃한 원소가 없는 것)임을 처리해주는 것입니다.

웅덩이의 크기는 UNION_FIND 할 때, par, siz, rnk 3개의 배열을 사용할 텐데, 여기서 siz배열로 알아보시면 될 것이고

각 칸의 높이는 1이상 10 이하인 것은, 각 칸들의 숫자를 모아 정렬해서 한칸씩 보는 것으로 해결할 수 있을 겁니다

이렇게 하시면 O(W*H*ack(W*H)) (? union find의 시간복잡도 계수가 뭐더라 편의상 ack()로 표현함) 으로 판별 가능합니다.

nlkey2022   5년 전

아크만 역함수 말씀하시는거죠?

감사합니다. rnk는 가장자리를 포함하는 집합을 구분하기 위해서 사용하는 배열이 맞나요?

atomzeno   5년 전

네 아크만 역함수 맞습니다 ㅎㅎ

그냥 위의 3개 배열은 제가 유니온 파인트 짤 때 쓰는 배열이므로, 신경쓰지 않으셔도 됩니다!

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