174291   5년 전


<main 함수>
토마토의 정보를 입력 받을 때,
익은 토마토의 좌표를 큐에 담는다. .


<riping 함수>

0. 익은 토마토 좌표 큐의 사이즈를 저장해둔다
1. 큐에서 좌표를 하나 꺼낸다.
2. 큐의 좌표를 보고 익은 토마토에 인접한 안 익은 토마토들을 찾는다
3. 안 익은 토마토들을 익히고 그 좌표를 큐에 담는다
4. cnt(횟수)를 1 올린다.

위 과정을 cnt=(1번에서 저장한 큐사이즈) 가 될 때까지 반복하면
하루동안 토마토를 익힌 것이 된다


,
<ripeDay함수>

riping 함수를 실행할 때마다 day 를 1씩 올린다
더이상 익은 토마토가 없을 때까지 riping 함수를 반복한다.
day를 리턴한다


토마토가 다 익었는지 판단하기 위해,
토마토 상자의 값을 모두 곱한 것을 mul 이라고 하고,
mul이 0인지 확인했다
(모두 곱했는데 0이 나왔다는 것은 하나라도 안 익은 것(0)이 있다는 의미이므로)




---



위와 같은 과정으로 했는데, 다 익히는 것이 불가능한 경우를 어떻게 해야할 지 모르겠습니다


가령 아래와 같은 경우에 (0,0) 토마토에 인접한 익은 토마토가 없기 때문에,

3 3
0 -1 0
-1 1 0
1 0 1


(0,0) 토마토는 익을 수가 없고
그러면 계속 안 익은 토마토가 있으니까
ripeDay 함수 종료 조건에 따르면
mul이 계속 0이어서 무한 루프에 빠져야 될텐데
그렇지 않고 아래와 같은 결과가 나옵니다


<입력>
3 3
0 -1 0
-1 1 0
1 0 1

<출력> 토마토가 익는 과정을 보기 위해 출력을 해봤습니다


0 -1 0
-1 1 1
1 1 1

0 -1 1
-1 1 1
1 1 1

0 -1 1
-1 1 1
1 1 1

<여기를 보시면 영향을 줄만한 토마토가 없는데 (0,0) 토마토가 혼자 익어버렸습니다>

1 -1 1
-1 1 1
1 1 1

1 -1 1
-1 1 1
1 1 1


DAY IS 4




코드를 설명하다보니까 질문이 많이 길어졌네요 ㅠㅠ
어떻게 해야할 지 알려주신다면 정말 감사하겠습니다


djm03178   5년 전

상자의 범위를 벗어날 수 있는지 범위 체크를 하세요. 지금 코드는 -1이나 n, 심지어는 -10000까지 나가도 운 나쁘게 해당 메모리 위치에 우연히 0이 들어있기만 하다면 그대로 진행합니다.

174291   5년 전


말씀해주신대로 범위를 체크해서
못 익는 토마토가 익어버리는 문제는 해결했는데
그랬더니 예상대로 무한루프가 됐습니다 ㅠ


아무래도 종료 조건을 바꾸는 게 좋을 것 같은데
토마토들의 곱이 0인지 확인하는 것 말고
다른 종료 조건이 뭐가 있을까요..

어찌됐건 답변 감사합니다!!


djm03178   5년 전

큐가 비어있을 때 종료하면 됩니다.

174291   5년 전

덕분에 풀었습니다 정말 감사드려요!!!!

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