알고리즘/프로그래머스 1단계
프로그래머스 - 삼총사 - C++
게임만드는학생
2023. 10. 21. 18:47
https://school.programmers.co.kr/learn/courses/30/lessons/131705
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include<iostream>
using namespace std;
int answer = 0;
void recur(vector<int> number, int cnt, int num, int index)
{
if (cnt!=3&&index >= number.size())return;
if (cnt == 3)
{
//cout << "end : " << cnt << ' ' << num << ' ' << index<<endl;
if (num == 0)
answer++;
return;
}
num += number[index];
//cout <<"더함 : "<< cnt + 1 << ' ' << num << ' ' << index + 1 << endl;
recur(number, cnt + 1, num, index + 1);
num -= number[index];
//cout << "더하지않음 : " << cnt<< ' ' << num << ' ' << index + 1 << endl;
recur(number, cnt, num, index + 1);
}
int solution(vector<int> number) {
recur(number, 0, 0, 0);
return answer;
}
설명
이 문제는 주어진 배열에서 숫자 3개를 더한 합이 0이 되는 조합의 개수를 찾는 문제이다.
3중 for문이나 재귀함수로 풀 수 있는데 여기선 재귀로 풀었다.
매개변수는 순서대로 수의 배열, cnt== 더한 수의 개수, num== 수의 합, index == 더해야하는 인덱스 이다.
재귀함수에서는 반드시 종료조건이 포함되어야한다. 여기서는 index가 범위를 벗어나거나 cnt가 3이되면 종료되도록 했다.
if (cnt!=3&&index >= number.size())return;
이 조건에서 주의해야할 것은 index만을 비교할게 아니고 cnt가 3이 아니면서 index가 범위를 벗어났을 때 종료해야 된다는 것이다. 단순히 index가 범위를 벗어났을 때 종료하라고 한다면 마지막 숫자를 더했을 때, 그 다음은 index가 범위를 벗어나기 때문에 답이 되는지를 비교하지 않고 종료가 된다. 주의하자.
if (cnt == 3)
{
//cout << "end : " << cnt << ' ' << num << ' ' << index<<endl;
if (num == 0)
answer++;
return;
}
다음으로 이 조건으로 3개숫자의 합이 0이 돼서 답이 되는지를 판단한다.
그리고 재귀되는 구간인 코드이다.
num += number[index];
//cout <<"더함 : "<< cnt + 1 << ' ' << num << ' ' << index + 1 << endl;
recur(number, cnt + 1, num, index + 1);
num -= number[index];
//cout << "더하지않음 : " << cnt<< ' ' << num << ' ' << index + 1 << endl;
recur(number, cnt, num, index + 1);
현재 index인 수를 더하거나 더하지 않고 재귀를 실행한다.
이렇게 해야 모든 경우의 수를 파악할 수 있다.