yongjunleeme   2년 전

고수님들의 도움을 구합니다 ..! 흐억헉헉

statco19   2년 전

저도 그 쯤에서 틀렸는데 활성화 바이러스가 비활성화 바이러스를 만났을 때 활성화로 바꿔주는 거랑 비활성화 바이러스가 존재해도 빈 칸만 없으면 완료로 간주하게 코드를 바꿨더니 성공했어요.

yongjunleeme   2년 전

와.. 알려주셔서 정말 감사합니다. 

헌데 아직도 통과를 못했습니다 ㅠㅠ

말씀주신 2가지를 아래 코드에 반영한 것 같은데.. 안 되는 이유를 혹시 아실까요~?

활성화 바이러스가 비활성화바이러스를 만날 때 활성화는 시켜주되 시간은 늘리지 않았는데.. 이게 맞는지 불확실한 것도 같고.. 

도움을 구합니다!

statco19   2년 전

// 활성화 바이러스가 비활성화 바이러스를 만났을 때 활성화로 바꿔주는 거

if(board[nx][ny] == 2) dist[nx][ny] = dist[cur.X][cur.Y];

이 부분에서 비활성화 바이러스를 바이러스로 바꿔줄 때도 시간이 계속 흘러야 합니다. 그래서

if(board[nx][ny] == 2) dist[nx][ny] = dist[cur.X][cur.Y] + 1; 로 바꿔줘야 합니다.

그런데 이렇게 해도 정답처리가 되지 않습니다. 그 이유는 바이러스가 퍼져나가서 모든 곳을 다 채우는 데 까지 걸린 시간을 dist라는 2차원 배열에서 가장 큰 숫자 값으로 결정하고 있기 때문입니다.

5 1
0 2 2 2 2
0 1 2 2 2
0 1 2 2 2
0 1 2 2 2
0 1 2 2 1

이 반례를 돌려보시면 답이 5가 나와야 하지만 6이 나오게 됩니다. 그 이유는 최단 시간이 나와야 하는 경우인 1행 2열에서 바이러스가 퍼지기 시작해도

모든 0인 공간을 다 채우는 데 걸리는 시간 < 비활성화 상태인 바이러스(2)를 통해 퍼지는 시간이기 때문입니다.

0인 공간이 모두 다 채워져도 큐에 먼저 들어와 있던 활성화된 비활성화 바이러스가 여전히 큐에 남아있게 되고 break로는 for문만 탈출하기 때문에 그 결과 큐에 남아있던 활성화된 바이러스가 한 번 퍼지게 됩니다. 즉, 위의 반례를 실행하고 난 후에 최소시간이 나오는 dist를 살펴보게 되면

1 0 1 2 3
2 -1 2 3 4
3 -1 3 4 5
4 -1 4 5 6
5 -1 5 6 -1

위와 같은 상태가 됩니다. 항상 +1이 된 값이 나오는 것이 아니고, 활성화된 바이러스가 큐에 남아있게 될 때 이런 경우가 발생하게 됩니다.

퍼지는 데 까지 걸리는 시간을 dist 2차원 배열에 표시하지 마시고 BFS while문을 한 번 돌때 큐에 새로 퍼진(혹은 새로 활성화된) 바이러스의 개수만큼 for문을 돌려서 재확산시키고 시간을 1초씩 증가시키는 방식으로 접근해 보시면 좋을 것 같습니다.

yongjunleeme   2년 전

뜨헉~ 미처 답변을 못 달았네요. 질문 드리고 나서 해결하였습니다.

statco19님 정말 감사합니다. 바쁘실텐데 구체적인 반례까지 알려주시다니 정말 고개 숙여 감사드립니다!

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