dlftls38   8년 전

제발 도와주세요


-코드설명

100x100x100크기기에

여유있게 111x111x111크기의 배열을 잡습니다

first배열은 토마토상태의 배열


-첫 3중포문

우선 모두 토마토가없는걸로 간주하여 모두 -1로 처리해둡니다


-둘째 3중포문

토마토 상태를 입력받습니다 after는 다음 날짜를 위한 배열입니다

stack은 queue를 써도되지만 그냥stack로했습니다

처음엔 모든 토마토를 살피며 익었으면 주변의 안익은걸 익게만들게했지만

시간초과가떠

익은 토마토의 위치만 확인하여 시간을 줄이기 위해 익은 토마토의 위치를 저장한것이 stack배열입니다


-while문

while문이 한번 돌때마다 날짜 day변수가 증가합니다

while문의 첫 for문은

익은 토마토주변의 안익은 토마토를 익게 만들며 (after에 바뀐내용저장)

안익은토마토 ㅡ> 익은토마토가 되는 위치들은 stack에넣습니다


(while문으로 짠 bfs같은 느낌입니다)

둘째 for문과 셋째 for문은

확인한 익은토마토는 지우고 안익은토마토 ㅡ> 익은토마토가 되는 위치를

앞으로 땡기는 작업입니다


그다음 3중for문은

안익은 토마토가 남아있는지 확인하며 (toicx++)

first배열을 after배열로 바꿈으로써 날짜를 바꾸는것입니다


그리고 세가지 if문은 출력값이 나올수있는 조건들입니다


i) 처음부터 모두 안익은 토마토인경우(day==0 && toicx==0)

ii)안익은토마토가있는데 익게만들수없는경우

(change변수 = 안익은토마토ㅡ>익은토마토로바꾸는 횟수)

(즉 toicx>0 && change==0 이말은 안익은 토마토는 있는데 바뀐횟수0)

iii)익지않은토마토 갯수가0일때 날짜 출력(toicx==0)


**** 이러한 코드인데요

예시와 제가 만들어본 여러 예시를 들어보면 답이 맞게나옵니다.

하지만 제출을 해보면 *런타임에러* 가뜹니다

이럴 경우를 대비해 배열크기도 매우 여유있게잡고

좌표의 -1 부분을 대비해

(0,0,0)부터 시작이아닌 (1,1,1)부터 시작했는데도 런타임에러가 왜뜰까요.. 부탁드립니다

yukariko   8년 전

런타임 에러의 원인은 스택 배열범위 초과라고 생각합니다.

위 코드는 중복제거가 되어있지 않다는 문제가 있습니다.

예를들어 스택에 (1,1)과 (1,3)이 들어있다고 가정하고,  (1,1) 에서 (1,2)를 추가했다고 가정한다면,

마찬가지로 (1, 3) 또한 (1,2)를 추가할 수 있게 되는겁니다.

현재까지의 스택을 전부 비우고 나서는 다시 first를 after로 초기화 해주지만,

남아있는 스택끼리는 중복 좌표를 삽입할 수 있게되고, 여기서 스택큐가 점점 늘어나면서 배열범위 초과를 일으키게됩니다.

dlftls38   8년 전

행님.. 감사합니다 check[111][111][111]만들어서 해결했습니다

그부분을 생각하고 stack을 여유있게잡은건데도 안되는거였네요 감사합니다

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