skyinyour   6년 전

처음에는 큐를 사용해서 메모리초과가 나서 큐가 원인이라 생각했습니다.

다시 생각해보니 비슷할 것 같은데 struct 배열을 사용하여 다시 풀어보았지만

메모리 초과가 어디서 어떻게 왜 나는지 모르겠네요 ㅠㅠ

djm03178   6년 전

dfs가 무려 2500만 개의 점을 탐색하게 될 텐데, 재귀 호출에 대한 정보는 스택 영역에 할당되므로 8MB 이상을 사용할 수가 없는데 이는 이를 훨씬 초과하게 됩니다.

애초에, 이 문제를 모든 가능한 좌표를 하나씩 방문하면서 푸는 건 무리라고 생각합니다.

skyinyour   6년 전

아하.. 다른 방법을 찾아봐야겠네요 ㅠㅠ

근데 여기서 더 여쭤보고싶은게 있습니다!

1. 스택 영역에는 왜 8MB 이상 사용 할 수 없나요?

2. 제가 접근한 방법에서는메모리가 그러면 4 byte * 2500만 정도를 사용하는건가요?

3. 보통 메모리 계산? 추정을 어떤식으로 하나요.. ? ㅠㅠ

djm03178   6년 전

1. 저도 정확한 이유는 모르겠지만, 운영체제마다 보통 1MB ~ 8MB를 스택 영역의 기본 한계로 잡습니다. 조정은 가능하다고 알고 있지만, 온라인 저지에서는 어떻게 할 수가 없습니다.

2. 4바이트 정도가 아니라, dfs에 전달되는 인자만 4바이트 2개에 8바이트고, 여기에 리턴 주소와 함수 내부에 선언된 지역변수들 등까지 계산하면 매 호출마다 20바이트는 넘어가리라고 생각됩니다. 재귀함수에서 조심해야 할 부분 중 하나인데, 호출 스택이 메모리에 그대로 쌓여가기 때문에 깊이가 깊어지는만큼 메모리 사용량이 늘어나게 됩니다.

djm03178   6년 전

3. 메모리 계산도 시간복잡도 계산하고 비슷합니다. 일단 지역이나 전역변수로 처음부터 크기가 고정되어 있는 것은 그대로 계산하면 되고, 여기에 동적으로 할당되는 메모리 공간들이나 재귀호출 같은 것들은 그 입력에 따라서 얼마나 크기가 할당되고 얼마나 깊이가 들어가는지를 파악하면 됩니다.

예를 들어, int n; scanf("%d", &n); int dp[n][n]; 은 O(N^2)의 메모리를 요구한다는 걸 쉽게 알 수 있습니다.

skyinyour   6년 전

아하.. 상세한 답변 너무 감사합니다 ㅠㅠ 더 공부해야할 방향이 잡히네요!! 감사합니다 :)

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