inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

237

이효민

작성한 질문수 25

0

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

 

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

<질문>

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

     

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

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

     

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

c++ 코딩-테스트

답변 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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

4 - A

0

6

1

코딩살구클럽 입장이 안됩니다

0

46

2

4-F 경우의 수 질문입니다.

0

29

2

코딩살구클럽 가입이 안됩니다.

0

59

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

51

1

교안 158페이지 문의드립니다

0

42

2

코딩살구클럽 관련 건의사항

0

104

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

44

1

진행 방법 질문드립니다!

0

77

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

63

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

307

2

백준 서비스 종료

9

939

1

sk 하이닉스 코테 대비

0

382

2

3-G 최댓값 질문

0

53

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

68

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

178

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

71

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2