inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

1189 컴백홈 문제 질문

425

bunny

작성한 질문수 19

0

안녕하세요

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

http://boj.kr/1466145ff6884308af8686628e0cf03b

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

int ny = y + dy[i];

int nx = x + dx[i];

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

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

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

답변 2

0

oort_cloud98

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

0

bunny

감사합니다.

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

0

큰돌

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

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

http://boj.kr/14165256fe4d4405bdc265fe3d5d5121

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

 

감사합니다.

0

bunny

감사합니다!

1-E질문입니다!

0

533

2

3-L 틀린 부분 피드백 부탁드립니다.

0

835

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

469

1

문제 풀 때 방향성에 대해

0

809

1

맥에서 vs code로 실행 관련 질문입니다

0

530

1

17071번 메모리 초과

0

389

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

637

2

1-O 13번 라인

0

445

1

6-J 놀이공원 문제 질문

0

388

1

구현관련 질문

0

491

1

강의 교안

0

321

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

550

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

539

1

1-K

0

481

2

3-G번 질문있습니다.

1

480

3

3-C 실행 시간 질문드립니다.

0

502

1

4-A 문제 풀이 질문있습니다.

0

601

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

349

1

3-O go 함수 질문 드립니다.

1

452

2

4-A 출력 질문

0

307

1

1주차 1-O 질문드립니다

0

264

1