inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

61. 특정 수 만들기 (MS 인터뷰 문제 : DFS 완전탐색)

else문 내를 다르게했더니 출력이 이상합니다.

258

OneLine

작성한 질문수 5

1

                path[L] = +a[L];
		s += a[L];
		DFS(L + 1, s); 
		path[L] -= a[L]; 
		s -= a[L]; 
		DFS(L + 1, s);
		path[L] = 0;
		DFS(L+1, s); 
dfs함수의 else문 내를 이렇게 s를 따로 계산하고 s를 넘겨주니, 2460이 두번 출력됩니다. 
선생님 코드와의 차이는 s-a[L]을 넘겨줬느냐 계산후 넘겨줬느냐 인데 어떤 차이 때문인가요?

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

답변 2

1

김태원

else{
		s=s+a[L];
		DFS(L+1, s);
		s=s-a[L]
		DFS(L+1, s);
		DFS(L+1, s);
	}

위의 코드를 가지고, 

영상에서 처럼 처음 DFS(1, 0)으로 시작해서 2+4+6 까지 s에 더하고 8을 적용하는 함수인 DFS(4, 12) 함수를 가지고 설명하겠습니다. 

s=s+a[L];    //s=12+8이 되어 매개변수 s=20이 됩니다.

DFS(L+1, s); //DFS(5, 20)으로 호출이 일어납니다.

s=s-a[L];   // s=20-8이 되어 s=12가 됩니다. 여기서 중요한게 되돌아 왔을 때 매개변수 s의 값은 20입니다.  위 코드 s=s+a[L]에서 DFS(4, 12)의 매개변수 s를 20으로 바꾸었다는 것을 명심하세요. 즉 이 코드는 s=s+a[L]에서 8을 더한 것을 다시 8을 빼주어 원래 s값인 12로 되돌리는 효과입니다.

DFS(L+1, s);  //DFS(5, 12) 가 호출되어 2+4+6-8인 상황인데 s는 4가 아니라 12로 넘어간다는 것이 오류입니다.

DFS(L+1, s);  //DFS(5, 12)가 호출됩니다. 2+4+6 상황으로 여기는 맞는 경우입니다. 여기가 맞을 수 있는 것은 s=s-a[L]에서 원래의  s값이 12로 바꾸어 놓았기 때문입니다.

결론은 DFS(4, 12)의 매개변수인 s를 함수 안에서 바꾸면 안되는 것입니다. 함수 안에서는 계속 12를 유지해야 합니다.

스스로 상태트리를 그려가면서 집요하게 분석해 보세요.

0

OneLine

감사합니다. 인위적으로 스택프레임내에서 매개변수를 바꾼것이 꼬이게 만드는 것이군요.

테스트 케이스 질문

0

373

1

병합정렬 시간복잡도 질문

0

462

1

41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.

0

1345

2

질문드립니다.

0

376

1

질문드립니다!

0

430

1

dev 프로그램 질문

0

275

1

문제가 이해가 안되요

0

376

1

4번 나이차이 문제 접근법 질문 드립니다.

0

307

1

source file not compiled

0

1047

3

59번 질문드립니다.

0

372

1

25번 문제 질문

0

349

1

4. 나이차이 문제 질문입니다.

0

372

1

90번 라이언 킹 심바 1번 테스트 케이스

0

470

1

71번 문제 전역 변수 질문 있습니다

0

365

1

75번, 79번 priority_queue관련

1

355

1

75.최대 수입 스케줄

0

400

2

복면산 정답의 수

0

431

1

테스트 케이스에 대해서

0

445

1

수업 내용 질문입니다!

1

232

1

풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!

0

822

2

12. 플로이드-와샬(그래프 최단거리) . 27:25초

0

254

1

다른 풀이 방식

0

317

1

크루스칼 vs 프림

0

306

1

숫자 총개수 small 질문있습니다.

0

242

1