ashi3914   5년 전

재귀함수로 문제를 구현했습니다. c언어로 똑같이 구현해본결과 시간초과가 뜨더라구요 재귀를 사용하니까..


문제는 c로 구현했을때는 시간초과가 뜨는한이 있어서 컴파일은 됬었거든요...

그런데 java로 빌드업을 하면 배열인덱스초과라는 에러가 뜨네요... 아무리봐도 배열이 초과되는부분이 없는데 말이죠

수분들께서 좀 봐주시고 알려주시면 정말 감사하겠습니다.( 그저 공부하는 차원에서 모르고 넘어가기가 찝찝하더라구요)

파일을 하면 27번쨰줄과 50번쨰줄이 에러라고 나오네요






isku   5년 전

ny와 nx의 범위를 체크하기 전에 visited[ny][nx]를 확인하고 있네요.

djm03178   5년 전

자바에서 논리 AND와 논리 OR 연산은 short circuit evaluation을 합니다. 이게 무슨 뜻이냐면, 연산의 좌항부터 먼저 평가를 시작해서 AND의 경우 왼쪽 식이 거짓이면 오른쪽 식은 아예 실행도 하지 않고, OR의 경우 왼쪽 식이 참이면 오른쪽 식을 아예 실행도 하지 않는다는 뜻입니다. 결국, 어느 경우든 왼쪽 식은 반드시 실행합니다.

27번째 줄의 경우 visited[ny][nx] == 0이 가장 왼쪽에 있으므로 이 식을 먼저 평가해야 됩니다. 그런데 이 시점에서 ny나 nx가 배열의 범위를 벗어났다면, 이 접근 자체가 허용되지 않게 되므로, 예외가 발생하여 런타임 에러가 됩니다. 식의 순서를 바꿔서 visited[ny][nx] == 0이 가장 오른쪽에 가게 하면, ny와 nx의 범위를 체크하는 나머지 조건식이 모두 참이어야만 실행되므로 안전합니다.

ashi3914   5년 전

정말 생각도 못했던 부분이네요 두분다 정말 감사드립니다 ^^

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