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

이효민님의 프로필 이미지
이효민

작성한 질문수

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

맞왜틀팁 : 전역변수를 사용할 때 주의할 점 | 3-Q 보완설명

1189_컴백홈 전역변수 지역 변수

해결된 질문

작성

·

161

0

안녕하세요 큰 돌님, ret의 지역변수 선언과 전역변수 선언에 궁금한 점이 있습니다.

 

ny,nx와 같이 재귀함수의 매개 변수로 사용되는 변수는 지역변수로 선언 해야 한다는 것은 이해 했습니다. 그런데 ret은 매개변수로 사용되는 것이 아니기에 전역 변수로 사용해도 된다고 생각했습니다.

<질문>

  1. 왜 ret을 go 함수가 호출 될 때마다 저 자리에서 초기화 해야 하는지 모르겠습니다.. 재귀가 돌 때마다 초기화 되면 ret+=dfs(ny,nx); 이렇게 누적했던 합도 초기화되는 것 아닌가요?

     

    아니면 int ret=0;선언이 ret+=dfs(ny,nx); 이 과정 앞에서 선언되었기 때문에 return 해서 값을 누적 할 때에는 영향을 안미치는 건가요?

  2. ret을 전역 변수로 선언하면 왜 틀리는지 모르겠습니다..

     

제가 아마 재귀함수의 구조를 완벽히 이해 못해서 그런 것 같긴하지만 어디를 잘못 이해하고 있는지 모르겠어서 질문 남깁니다 ㅠㅠ

답변 1

2

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

안녕하세요 효민님 ㅎㅎ

	int ret = 0; 
	for(int i = 0; i < 4; i++){
		int ny = y + dy[i];
		int nx = x + dx[i];
		if(ny < 0 || nx < 0 || ny >= n || nx >= m || visited[ny][nx] || a[ny][nx] == 'T')continue;
		visited[ny][nx] = visited[y][x] + 1; 
		ret += go(ny, nx);
		visited[ny][nx] = 0;
	}
	return ret; 

이부분의 의미는 해당 dfs에서의 자식노드들들로 부터 어떠한 값을 누적해서 값을 반환한다는 의미입니다.

예를 들어

1 -> 2

1 -> 3

이렇게 되어있을 때 1이라는 정점에서 2, 3 정점을 통해 2라는 값을 내는 것이죠.

원리는 이런데요.. 하나하나 답변드리면요.

 

왜 ret을 go 함수가 호출 될 때마다 저 자리에서 초기화 해야 하는지 모르겠습니다..

>> 해당 정점의 초기값은 0이여야 합니다.

1 -> 2

1 -> 3

여기서 1에서 0이라는 값을 가지면 총 4라는 값이 나옵니다.

끝에 가서 2, 3 에서 1을 반환해서 다 더해서 2라는 값을 만들어야 하는 것이죠.

 

  1. ret을 전역 변수로 선언하면 왜 틀리는지 모르겠습니다..

     

>> 이걸 전역으로 하기에는 무리가 있습니다. 경우의 수라는 것은 정점을 지나가면서 해당 정점의 경우의 수를 더해야 합니다. 즉,

1 -> 2 -> 3

-> 4

 

-> 5 - > 6

 

이렇게 되어있을 때

1 -> 2 -> 3

-> 4

3, 4 -> 2 -> 1 이렇게 반대로 타고오면서 +1, + 1 / +2 / + 2 되고 5, 6 도 그런과정이 재귀적으로 일어나게 되면서 결국 3이라는 값을 반환해야 하는 것이거든요.

즉, 로컬적인 값들을 더하면서 글로벌한 해를 만들어야 하기 때문에 로직상 전역으로 하기에는 무리가 있습니다. 로컬적인 값을 저장해야 하거든요.

 

 



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

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

이효민님의 프로필 이미지
이효민

작성한 질문수

질문하기