severck12   2년 전

bfs를 이용하여 구현했는데, 개인적으로 만든 케이스도 모두 통과하는데

오답으로 처리됩니다.. 어느부분이 틀렸는지 궁금합니다

asz2325   2년 전

코드 상 취약한 부분이 있습니다.

line 11~15 부분을 자세히 보시면 될 것 같습니다.

고민해본 뒤 모르겠다면 아래 글을 참고해주세요.

https://www.acmicpc.net/board/...

severck12   2년 전

저는 11번 문장에서 들어온 x,y변수를

재 선언없이  while문에서 그대로 사용하는것인데 실행할때 문제가 될만큼 취약한건가요?

어떤면에서 문제인지 모르겠습니다ㅜ

asz2325   2년 전

저 또한 컴파일러의 작동 원리에 대해 조예가 깊은 것은 아니지만, 오랜 고민 끝에 내린 추측에 따르면....

아마 코드가 최적화 되는 과정에서 아래 과정이 실행되는 게 아닐까 싶습니다.

(1) bfs 함수의 while문 최초 진입 시  q.front()의 pair원소의 값을 x, y에 대입해주는 과정이 발생하는데, 이 때 q.front() 가 가지고 있는 값은 x, y가 가지고 있는 값과 일치합니다. 컴파일러 입장에서는 불필요한 과정(x=x, y=y;)을 거치는 것이기 때문에 최초 q.front() 의 주소값을 매개변수의 주소값과 일치하도록 컴파일합니다.

(2) queue 는 데이터를 push 해주면 그 값을 가진 주소를 back에 이어붙이고, pop을 해주면 front를 가르키는 주소에 있는 값을 dummy로 변경합니다.  이는 아래 코드로 직접 확인 가능합니다.

printf("x : %p, y : %p, q : %p, q.front : %p, q.popped : %p \n", &x, &y, &q, &q.front(), &q.front() - 8) //제 컴파일 환경에서는 큐의 데이터 변경작업을 최소화 하기 위해 8 바이트 단위로 queue가 연결되어 있었습니다. int 자료형 2개를 pop해주면 그제서야 앞의 두개를 지우는 느낌으로...

(3) 앞의 두 과정에 의해, 큐의 첫 pop() 당시 x, y가 가지고 있는 좌표값이 아닌 dummy 값이 x, y에 dumped 되고, 에러가 발생하게 됩니다.

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