xotmd17   5년 전

질문검색내용을 보면 갔던 곳을 다시 가지 않게만 하면 BFS를 사용해서 가능하다고 했는데

왜 런타임에러가 나는 것 인지 모르겠습니다. 1 12004 까지만 가능합니다.

오류가 나는 이유가 무엇인지 알려주세요 ㅠㅜ

djm03178   5년 전

qx가 0보다 작거나 100000보다 커질 수 있으니 범위 검사를 해야 합니다.

xotmd17   5년 전

if(X[qx] == 0 && qx >= 0 && qx <= 100000)

한번도 간적 없고, 0과 100000 사이일때만 가는 조건입니다.

이 부분이 검사를 하는 것으로는 안되는 건가요?

djm03178   5년 전

앗 제대로 못 보고 답변했네요. 이 경우 X[qx]에 접근하는 작업을 먼저 하는데 그 자체가 문제가 됩니다. 범위 검사를 먼저 하고, 그 뒤에 배열의 그 칸을 봐야 됩니다.

xotmd17   5년 전

감사합니다.

if(X[qx] == 0 && qx >= 0 && qx <= 100000)를

if(qx >= 0 && qx <= 100000 && X[qx] == 0)로 바꾸니깐 성공은 했습니다.

그런데 어째서 이 차이하나로 안되는 건지 알려주실 수 있나요?

&&로 묶었는데 이렇게 되는걸 까요?

앞의 범위조건을 벗어나면 뒤 조건을 확인하지 않는 것 때문인가요?

조건 몇 번 때문에 런타임이 날 수도 있는건가요?

djm03178   5년 전

C++에는 short-circuit evaluation이라는 것이 있어서, 논리 AND나 OR 연산에 대해 좌항을 먼저 평가한 뒤, 그로 인해 전체 식의 참/거짓이 결정될 경우 우항은 실행하지 않습니다. AND의 경우 좌항이 false이면 우항의 결과에 관계없이 전체 false가 확정되므로, 우항의 내용은 아예 실행하지 않게 됩니다. 반대로 OR의 경우 좌항이 true이면 우항의 결과에 관계없이 전체 true가 확정되므로 우항은 실행되지 않습니다.

만일 qx가 0보다 작거나 100000보다 크다면 X[qx] == 0의 결과에 관계없이 전체 식이 false인 것이 확정이므로 X[qx] == 0은 아예 실행하지 않게 됩니다.

xotmd17   5년 전

그냥 조건이 3개뿐이라 별 생각없었는데 좌항으로 인해 X[qx] == 0이 실행되냐 안되냐의 차이 하나로 문제가 풀리고 안풀릴 수 있다는 걸 알게되었습니다.

감사합니다. 

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