인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

bunny's profile image
bunny

asked

10-Week C++ Coding Test | Algorithm Coding Test

1189 컴백홈 문제 질문

Written on

·

405

0

안녕하세요

1189 컴백홈 문제 풀던 중 헷갈리는 것이 생겨 질문 올립니다.

http://boj.kr/1466145ff6884308af8686628e0cf03b

위 코드에서 변수 설정 부분에 int ny, nx를 전역 변수로 설정하면 틀리고,

int ny = y + dy[i];

int nx = x + dx[i];

지역 변수로 설정하면 답이 맞습니다.

왜 이런 일이 생기는지 설명해주실 수 있을까요?

C++코테 준비 같이 해요!

Answer 2

0

for (int i = 0; i < 4; i++)

{

ny = y + dy[i];

nx = x + dx[i];

if (ny < 0 || nx < 0 || ny >= R || nx >= C) continue;

if (visited[ny][nx] || map[ny][nx] == 'T') continue;

visited[ny][nx] = visited[y][x] + 1;

bt(ny, nx);

visited[ny][nx] = 0;

}

재귀함수 호출시 문제가 발생 합니답
nx, ny는 전역변수인데
재귀함수 블럭안에 있는 for문에서 nx, ny의 값을 직접 변경해줍니다.

nx, ny는 전역변수로 선언되어서 함수안에서 값이 바뀌면 함수 밖에서도 적용이 됩니다.
visited[ny][nx] = visited[y][x] + 1;

bt(ny, nx);

visited[ny][nx] = 0;

그렇게 됐을 때 해당 부분에서 에러가 발생합니다.
bt(순서 번호)라고 했을 때
bt(1) -> bt(2) -> bt(2)종료 -> bt(1) 종료 와 같이 함수가 실행 - 종료 됩니다.

(재귀함수는 도달할 수 있는 마지막 까지 도달 후 순차적으로 빠져나오게 됩니다 .
함수는 스택 메모리에 저장되어 순차적으로 실행 되기 때문입니다.)

해당 코드는 재귀함수 내에서 전역변수값이 계속 해서 변하는데 마지막 변한 값의 방문기록을 0으로 설정해서 값이 다르게 나옵니다.

조건문이 많아 글로 설명하기는 어렵고 로그를 찍어서 확인하는게 직관적일 것 같아 소스 코드 공유합니다.
http://boj.kr/01257c364adf4e629f6ebb1690378095

bunny님의 프로필 이미지
bunny
Questioner

감사합니다.

헷갈릴 경우가 있어 bfs dfs의 경우 ny,nx는 지역 변수로 설정하는 것이 생각하기 편할 것 같아요.

0

kundol님의 프로필 이미지
kundol
Instructor

해당 부분 테스팅해봤고 이상하네요... 무조건 지역변수로 선언해야된다!

이런건 절대 아닙니다. 참고로 다른 문제는 전역변수로 ny, nx 해도 맞습니다.

http://boj.kr/14165256fe4d4405bdc265fe3d5d5121

음 해당 부분은 저또한 다른 분께 물어보고 답변 받으면 이 댓글에 올려드릴게요.

 

감사합니다.

bunny님의 프로필 이미지
bunny
Questioner

감사합니다!

bunny's profile image
bunny

asked

Ask a question