juhongkim2   7년 전

1.맵의 사이즈를 1<=y<=N, 1<=x<=M으로 받으면 ac

2.맵의 사이즈를 0<=y<=N-1, 0<=x<=M-1으로 받으면 틀립니다.


뭔 차이죠?

IsinRange()함수의 범위도

1.의 경우엔 (x<=0 || y<=0 || x>M || y>N)이면 0을 반환하도록

2.의 경우엔 (x<0 || y<0 || x>=M || y>=N)이면 0을 반환하도록

조절했는데도 1은 ac 2는 틀립니다.


어차피 x,y의 범위라는거 1부터 받던 0부터 받던 20부터 받던

배열 사이즈 안넘치고 맵 밖으로 나가는 부분만 잘 처리해주면 문제 없는거 아닌가요?


pichulia   7년 전

맞습니다. 배열밖으로만 안넘치도록 관리만 잘하면 상관없겠죠.

하지만 28번째줄이나 40번째줄에선 그러지 못한거같네요

juhongkim2   7년 전

여태까지 저렇게 풀었었는데
이 문제에서만 자꾸 틀리더라구요...

8068번 water 이문제도 28번째 줄이나 40번째 줄 처럼 처리했는데 8068번은 ac받았습니다

8068번이 비정상적이라기엔 여태까지 맵이랑 체크배열 사용해서 푸는 bfs문제는 다 이런식으로 처리했는데...

그냥 1부터 맵을 받는게 제일 안전하게 푸는거겠죠...?

pichulia   7년 전

음수 인덱스 접근이라는게 어떤 값이 잡힐지가 사실 컴파일러의 운에 따르는지라...컴파일러를 C++로 바꿔서 제출하면 또 다르게 나올 가능성도 있습니다ㅋㅋㅋ


 이번 문제의 경우 우연찮게 map 배열의 메모리가 다른 int변수 바로뒤에 할당되서 map [0][-1] 값과 map [-1][0]값이 모두 water보다 커지는 경우가 발생한..  안타까운 경우네요..


그리고 1부터 시작한다고 딱히 안전한건 아닙니다... 가장 안전한건 0부터 시작하더라도 저런 음수인덱스 접근이 안생기도록 코드를 잘 짜는 것이 제일 안전합니다.

juhongkim2   7년 전

답변 감사합니다

좀더 주의깊게 코드를 짜도록 해야겠어요ㅋㅋㅋㅋㅋ

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