https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 :
#include <string>
#include <vector>
using namespace std;
int answer = 0;
// 주어진 벡터 , 타겟넘버, 현재수행중인 숫자 인덱스, 현재까지 더해진 숫자 합
void DFS(const vector<int>& _Numbers, int _Target, int _Index = 0, int _Sum = 0)
{
if (_Index == _Numbers.size())
{
if (_Sum == _Target)
{
answer++;
}
return;
}
DFS(_Numbers, _Target, _Index + 1, _Sum + _Numbers[_Index]);
DFS(_Numbers, _Target, _Index + 1, _Sum - _Numbers[_Index]);
}
int solution(vector<int> numbers, int target) {
DFS(numbers, target);
return answer;
}
개선사항 :
- 글로벌 변수 사용:
- 나 : answer의 변수를 전역 변수로 선언하여 결과를 저장하고 있습니다.
- 개선 : answer변수를 함수 내부에서 관리하여, 함수 호출 시 초기화 되고, 다른 함수 호출과 독립적으로 결과를 계산할 수 있습니다.
- 코드의 구조와 함수 호출 :
- 나 : DFS함수가 solution함수 외부에 정의되어 있으며, 기본 인덱스와 합을 설정해 두고 시작합니다. 이로 인해 answer는 누적된 값을 유지하게 됩니다.
- 개선 : DFS함수는 solution함수 내에서 호출되고, answer는 지역 변수로 선언되어 함수 호출 시마다 초기화 됩니다. 따라서 함수가 호출될 때마다 새롭게 값을 계산하게 됩니다.
- 결론 :
- 전역 변수를 사용한 코드와 지역 변수를 사용한 코드는 큰 차이가 없지만, 전역 변수는 여러 번의 함수 호출 간의 상태를 관리하기 어렵게 만듭니다.
- 지역 변수를 사용하는 방식이 더 모듈화되고 예측 가능한 코드 작성 방법입니다. 이는 특히 여러 테스트 케이스를 처리해야 하거나, 코드를 재사용할 때 중요합니다.
- 전반적으로 개선사항을 수용하면 코드가 더 견고하고, 유지관리가 쉬운 구조를 가지게 됩니다.
개선 코드 :
#include <vector>
using namespace std;
void DFS(const vector<int>& numbers, int target, int& answer, int index = 0, int Sum = 0) {
if (index == numbers.size())
{
if (currentSum == target)
{
answer++;
}
return;
}
DFS(numbers, target, index + 1, Sum + numbers[index], answer);
DFS(numbers, target, index + 1, Sum - numbers[index], answer);
}
int solution(vector<int> numbers, int target) {
int answer = 0;
DFS(numbers, target, answer);
return answer;
}