shinbian11   1년 전

29,30 번째 줄 (Before) 과 33~35번째 (After) 줄은 같은 문장 아닌가요? 왜 Before) 처럼 하면 답이 틀리고, After)로 해야 맞는 답이 나오는지 궁금합니다.

myrmidonxd   1년 전

안녕하세요, 오래된 질문이라 이미 해결하셨을 수도 있지만 답변을 달아봅니다.

Before) 구현에서는 solution 함수 내의 ans는 19번 라인 int n, m, ans = 1e6; 에서 선언된 전역 변수입니다.

그리고 solution 함수는 결과값을 반환하기 전에 전역 변수 ans에 그 값을 대입하고 있습니다 (30, 38, 43번 라인).

이로 인해 42번 라인 int ansTmp = solution(index + 1, count + names[index] + 1); 에서 solution 함수가 호출되었을 때, solution 함수가 결과값을 반환하기 전에 전역 변수 ans에 그 결과값을 대입하기 때문에 ansansTmp의 값이 같아지게 됩니다.

따라서 바로 아래 43번 라인의 ans = min(ans, ansTmp); 가 항상 같은 두 값을 비교하게 되므로 의도와 다르게 동작하게 됩니다.

반면 After) 구현에서는 33번 라인 int& ans = dp[index][count]; 에서 ans지역 변수로 선언했기 때문에 이 라인 이후에 등장하는 ans는 전역 변수가 아닌 solution 함수 내의 지역 변수입니다.

따라서 solution 함수의 결과값 반환 전에 ans에 그 값을 대입할 때 (33, 38, 43번 라인), 이 ans는 지역 변수가 됩니다.

그러므로 Before)와 다르게 42번 라인의 solution 함수 호출 시, 그 호출 내에서 결과값이 대입되는 지역 변수 ans는 호출을 한 함수의 지역 변수 ans와 서로 다른 변수입니다.

이로 인해 43번 라인의 ans = min(ans, ansTmp); 에서 우변의 ans가 38번 라인에서 대입된 값을 그대로 갖고 있게 되므로, 의도한 대로 38번 라인에서 구한 ans 와 42번 라인에서 구한 ansTmp 중 작은 값을 택해 결과값으로 반환하게 됩니다.

이러한 과정을 통해 After) 구현에서는 올바른 답이 출력됩니다.

+ 변수명 왼쪽에 붙는 &는 C++에서 reference (참조자) 변수를 선언하는 문법입니다. 

이 질문에서는 ans를 지역 변수로 선언한 것이 문제가 해결된 이유였기 때문에, 위의 After) 구현의 33번 라인에서 ans를 reference로 선언하지 않고 int ans = dp[index][count];로 선언해도 똑같이 올바른 답을 출력합니다.

댓글을 작성하려면 로그인해야 합니다.