taehun0933   1년 전

한 3시간정도 열심히 풀었는데, 예외처리도 다 해주었는데 마지막에 시간 초과가 나서 너무 슬프네요..

풀이 시간쪽에서 개선 사항이 있을까요? 아예 갈아엎어야 할까요?

pill27211   1년 전

bfs를 포함한 전체 로직이 너무 비효율적입니다.

현재 while (!isRipe && !isInput0)의 매 사이클마다 최소(N * M) * 2만큼의 연산을 계속 추가로 하고 있고, N = 1000, M = 1000일 때를 생각하면 다소 무리가 있지요.

최초 1들의 위치를 큐에 먼저 넣는 건 정확한 발상인데 이는 '최초 한 번'이면 충분합니다. 매 사이클 마다 N * M을 돌며 추가해줄 필요가 전혀 없습니다.(bfs의 장점을 활용하지 못하고 있어요)

또한 마지막에서 n * m을 돌며 모두 1인지 확인하는 것 또한 bfs진행 후 '마지막에 한 번'이면 충분합니다.

bfs는 앞서 말씀 드린 최초 1들의 위치를 큐에 넣고, 큐가 빌 때까지 각 1들의 위치로부터 4방향 탐색을 진행하며 1의 영역을 점점 넓혀가면 됩니다.(그와 동시에 현재 영역이 방문된 시간을 기록하면서 진행하면 편리해요)

이후 마지막 체크 로직에서 문제가 없다면, 시간을 기록해둔 N * M배열에서 가장 큰 시간이 답이 되겠지요.

taehun0933   1년 전

감사합니다. 알려주신 개념에 대해 다시 한번 생각해보고 신중하게 코드를 짜니 바로 맞았어요. 감사합니다!!

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