shinbian11   3년 전

Q1. 제가 go 함수를 void 형으로 선언하고, 34번째줄을 return 1; 이 아니라 그냥 return; 으로 하고, 41,54줄에서 return 하지 않고 그냥 go(z+1) 만 쓰고,  66번째 줄에서도 return 0; 과 같은 선언을 하지 않았는데 답이 틀리게 나오는 이유가 뭔가요? 그러니까 이 문제에서 go 함수에 반환형을 두어야 하는 이유가 뭔가요? 반환형을 두지 않고도 맞출순 없나요?

Q2. go 함수에서 arr배열에 찾은 i값을 넣어주고 그 이후에 59~62번째 줄에서 굳이 값을 없었던 것처럼 되돌리고 복원한 이유는 뭔가요? 한번 채웠으면 냅둬야 나중에 최종 출력할때 제대로 출력되는걸로 이해했는데 잘못 이해했나요..

qktkzpal3301   3년 전

Q1. 41,54 번 라인에서 리턴을 하지않으면 종료되는것을 전제로 짜여진 함수가 의도하지 않게 동작해서 틀리지 않을까요?

Q2. 제가 이 문제를 풀어보지는 않았지만, 아마 백트래킹으로 동작하는것 같습니다. 반복문을 돌며 여러 경우를 탐색하기 때문에 배열을 조작한 후 함수 호출하지만, 그 다음 반복에서도 현재 배열에 대한 정확한 동작을 위해 배열을 복구하는것으로 보입니다.

qktkzpal3301   3년 전

41번 라인에서 배열에 0이 아닌 숫자가 채워져 있다면 종료하는 것으로 의도한 같고, 55번 라인의 return 1은 34번 라인의 return 1이 최초 수행되기 전(9행 9열까지 모든 숫자를 돌아 보기전) 에는 수행되지 않기 때문에, 34번의 라인의 return 1로 말미암아 전체 재귀 호출을 종료하려는 의도로 보입니다.

shinbian11   3년 전

저기서는 정상적으로 호출이 끝낫을때를 1로 반환을 하도록 하고, 40,42번째 분기문에 속하지 않고 종료되었을때 0으로 반환을 하도록 설계를 하였는데, 제가 Q1번에서 질문한 것처럼 설계를 하면 언제 종료가 되는지를 구별할수가 없기 때문에 제대로 동작이 안된다는 의미인가요?

qktkzpal3301   3년 전

함수를 void로 선언하고, 54번라인을 go(z+1)과 같이 짠다면 실제로는 z==81에 도달하여 배열이 완성되었음에도, 54번라인에서 종료되지 않기 때문에 배열을 다시 수정하며 함수호출을 진행할것으로 보입니다.

shinbian11   3년 전

흠 그럼 이 문제는 무조건 go 함수가 무언가를 반환하도록 해야하는건가요? 

go 함수를 void 로 하고, Q1의 질문처럼 반환형 없이 하되, z==81이 되어서 배열이 완성된 이후에 exit(1);과 같은 함수를 사용했더니 컴파일 오류가 뜨더라고요..

shinbian11   3년 전

vs에서 실행하면 실행은 잘 됩니다.

qktkzpal3301   3년 전

vs 실행이 잘된다고 온라인 저지에서 잘된다는 보장은 없습니다.

go 함수가 아무것도 반환하지 않게 하려면 말씀 하신 것처럼 구성한 후, 34번 라인의 return 1; 을 exit(0); 으로 대체하면 될것 같네요.

exit(1)을 사용하면 런타임 에러를 받는것으로 알고 있습니다.

컴파일 에러는 아마 다른 문제인듯 합니다.

shinbian11   3년 전

아아 런타임 에러를 컴파일 에러로 잘못 썼었네요 ㅠㅠ

어쨌든 무슨 말씀인지 이해했고 해결도 완료했습니다. 설명 감사합니다!

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