안녕하세요, 오래된 질문이라 이미 해결하셨을 수도 있지만 답변을 달아봅니다.
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
에 그 결과값을 대입하기 때문에 ans
와 ansTmp
의 값이 같아지게 됩니다.
따라서 바로 아래 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];
로 선언해도 똑같이 올바른 답을 출력합니다.
shinbian11 1년 전
29,30 번째 줄 (Before) 과 33~35번째 (After) 줄은 같은 문장 아닌가요? 왜 Before) 처럼 하면 답이 틀리고, After)로 해야 맞는 답이 나오는지 궁금합니다.