인프런 커뮤니티 질문&답변

sam7755님의 프로필 이미지
sam7755

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-Q

메모리초과

작성

·

529

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 1189번입니다

http://boj.kr/2a9ab2fcbd774ac1a5b75a140a5b5864

강사님 코드랑 몇번이나 대조해봐도 계속 메모리 초과가 나와서 질문드립니다@

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ 이 메모리 초과는 재귀함수를 많이 호출해서 생기는 초과에요.

메모리초과가 뜰 때는 배열을 많이 선언했나.

또는

재귀함수가 많이 호출되는 것은 아닌가를 중점적으로 디버깅을 하시는게 좋습니다.

원래 SAM님의 코드는 다음과 같은데요. 뭐가 문제일까요?

아 참고로 visited 부분은 q w = 0이렇게 되어있길래 고쳤습니다 :)

	for(int i=0;i<4;i++){
		y=q+dy[i];
		x=w+dx[i];
		if(y < 0 || x < 0 || y >=n || x >= m) continue;
		if(!visited[y][x]&&arr[y][x]!='T'){
			visited[y][x] = visited[q][w]+1;
			sum+=dfs(y,x); 
			visited[y][x] = 0; 
		}	
	}

바로 y, x를 전역변수로 선언한게 문제입니다.

지역변수와 전역변수의 차이를 좀 생각해볼까요?

지역변수는 스택에 위치하며 다른 함수의 인스턴스에 영향을 주지도, 받지도 않습니다.

교안의 있는 설명은 다음과 같습니다.

Stack은 지역변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역입니다. 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 stack에 계속해서 저장됩니다. 

또한, 재귀함수가 호출된다고 했을 때 새로운 스택 프레임이 매번 사용되기 때문에 함수 내의 변수 집합이 해당 함수의 다른 인스턴스 변수를 방해하지 않습니다.

 

자, 그렇다면 여기서 y, x는 dfs라는 재귀함수를 통해 변하게 되겠죠?

y, x = 1 >> dfs() >> dfs() >> y, x = 3

이런식이 될 겁니다.

근데 여기서

dfs 밑에 visited = 0이렇게 되어있는데요.

나는 y, x = 1에 해당하는 visited를 0으로 바꾸고 싶은데도 불구하고

y, x = 3이 0으로 바꿔지게 되는 것이죠.

전역변수를 적절히 쓰되 이런식으로 매개변수로 넘겨야 할 것은 전역변수로 쓰지 않는 것이 좋습니다.

 

제가 sam님의 코드를 기반으로 수정좀 해봤는데요. 참고 부탁드립니다.

http://boj.kr/c88eb7e6ed044d9ca494e30bef0ebeb0

그리고 담부터 질문하실 때 코드 들여쓰기 좀 부탁드립니다.

sam님은 질문을 많이 하시는 것도 열심히 하는것도 너무나 좋지만, 코드 디버깅하는 입장에서 들여쓰기 안된 코드 보는 것은 정말 힘듭니다..

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

감사합니다.

강사 큰돌 올림.

sam7755님의 프로필 이미지
sam7755
질문자

넵 감사합니다

큰돌님의 프로필 이미지
큰돌
지식공유자

아 그리고 sam님 혹시 오해하실까봐 말씀드리는데 질문 계속 주시는 것은 정말 좋습니다. 잘하고 계시고 있구요. :)

이해가 안되신다면 꼭 질문 주세요. 답변드릴게요. :)

sam7755님의 프로필 이미지
sam7755
질문자

잘하고 있는거 맞나요..ㅠㅠ

외워서 풀고있는거 같고 맨날 틀리고 머리가 나빠서 그런가 실력이 안올라서 그런가 현타오네요.,,.ㅜㅜ

큰돌님의 프로필 이미지
큰돌
지식공유자

ㅎㅎ 그런 생각이 들 때는 풀었던 문제도 다시 풀어봐주세요. 또한 복습도 해주세요. 예를 들어 3주차까지 했다면 1, 2주차때 어려웠던 문제 다시 풀기 이런식으로요.

그리고 외워서 푸는 것도 하나의 실력이 되니 걱정하지 마시구요. 정말 잘하고 계십니다.

이 자세로 꾸준히 8주차까지 드갑시다!

sam7755님의 프로필 이미지
sam7755

작성한 질문수

질문하기