ekfrhkquf12   4년 전

가로 세로도 다 체크했고 올려주시는 테스트케이스들이 다 맞는거같은데 왜 틀렸다고 나오는걸까요 !!

2x2 Check배열을 동적 할당으로 만들고

연결되어 있는 배추 수만 세면 되니까,

배추 있는 곳에는 1 표시 해주고,

방문한 곳은 0으로 바꿔주면서

dfs를 했는데요 ...

어디에서 틀린건지 잘 모르겠어요 !!!

도와주세요 ㅠㅠ 

wjsqjawns   4년 전

그대로 제출하시면 정답 처리가 됩니다.

ekfrhkquf12   4년 전

죄송하지만 언어를 C++로 선택해서 그대로 다시 제출해도 틀렸다고 나옵니다.


ekfrhkquf12   4년 전

언어를 C++이 아니라 C++14로 바꾸니 맞다고 나오네요 ... 감사합니다.

djm03178   4년 전

그걸로 해결! 하고 끝내시면 안 됩니다. 언어에 따라 결과가 다르게 나온다는 건 99% undefined behavior가 있는데 컴파일러가 컴파일 옵션에 따라 취한 행동의 차이 때문에 우연히도 결과가 다르게 나올 뿐입니다.

이 코드에는 치명적인 문제가 있습니다. 바로 c에 할당된 배열을 초기화하지 않았다는 점입니다. 입력으로 주어진 좌표가 아닌 지점에도 우연히 1이 들어있을 수 있고, 이 경우 답이 틀리게 나올 수 있습니다.

djm03178   4년 전

c 배열을 malloc 대신 calloc을 사용하여 초기화해서 C++로 맞은 코드입니다. http://boj.kr/bf05b5fdb1834205...

ekfrhkquf12   4년 전

제가 C언어를 잘못 이해하고 있었나보네요.

dfs()라는 함수를 각 테스트케이스마다 새로 불러오고, 그 안에서 C라는 배열을 동적 할당하므로,

함수가 불려와서 동적할당이 이루어질 때마다 메모리의 다른 부분에 배열이 계속해서 생길 것이므로 초기화하지 않아도 상관없다고 생각했거든요 !! 

76번째 줄 위에

for (int i = 0; i < n; i++) free(c[i]);

라는 코드를 추가하면서 malloc했던 것을 free를 제대로 해주니까

C++언어에서도 맞았다고 나왔습니다.

감사합니다.

djm03178   4년 전

그것도 맞는 방법이 아니고, 우연히 새로 할당받은 자리들에 답을 틀리게 만드는 쓰레기값이 들어있지 않아서 맞았을 뿐입니다.

malloc으로 할당받은 메모리는 아무것으로도 초기화가 안 되어 있고, 쓰레기값이 들어있습니다. 그 쓰레기값이 우연히도 코드를 틀리게 안 만들면 맞을 뿐이고, 틀리게 만들면 틀릴 뿐입니다. malloc으로 할당받은 후에는 반드시 수작업으로 초기화를 하는 과정이 필요합니다.

ekfrhkquf12   4년 전

아 그렇군요 !!

감사합니다!!

쓰레기값들이 우연히 임의의 값을 가질 수 있다는 것 명심하겠습니다.

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