DFS와 BFS를 이용한 풀이
그 중 DFS를 선택하여 활용하였다.
어피치와 라이언의 양궁대회에서 어피치가 화살 n개를 먼저 쏘고 라이언이 n개를 쏜다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int maxScore=-100; //가장 큰 점수차이
vector<int> answer(11, -1); //작은 점수를 가장 많이 쏜 경우
//점수 계산 함수
int makeScore(vector<int> RU, vector<int> AU){
int rs=0; //라이언 점수
int as=0; //어피치 점수
for(int i=10; i>=0; i--){
if(RU[i]>AU[i]){ //a<b인 경우
rs=rs+(10-i);
}
else if (AU[i]>0){ //a>=b인 경우
as=as+(10-i);
}
}
return (rs-as); //점수 차이 계산
}
//DFS 활용한 함수
void dfs(int target, int useable, vector<int>& ryan, vector<int> appeach)
//현제 과녁 점수, 사용 가능 화살 수, 라이언의 점수당 화살 갯수, 어피치의 점수당 화살 갯수
{
if(target==10 || useable==0){ //마지막 과녁 또는 화살
ryan[10]+=useable; //남은 화살은 모두 0점
if(makeScore(ryan, appeach)>0&&makeScore(ryan, appeach)>maxScore){
maxScore=makeScore(ryan, appeach); //가장 큰 점수차이 보다 큰 경우
answer=ryan;
}
else if(makeScore(ryan, appeach)>0&&makeScore(ryan, appeach)==maxScore) { //가장 큰 점수 차이와 같은 경우
for(int i=10; i>=0; i--){
if(ryan[i]>answer[i]){ //작은 점수를 많이 쏜 경우 비교
answer=ryan;
break;
}
else if (ryan[i]<answer[i]){
break;
}
}
}
ryan[10]-=useable; //0점의 화살 갯수 초기화
return ;
}
else{
dfs(target+1, useable, ryan, appeach); //점수를 얻지 않음.
if(appeach[target]+1 <= useable){
ryan[target]=appeach[target]+1; //사용 화살 갯수 적용
dfs(target+1, useable-(appeach[target]+1), ryan, appeach); //점수를 얻음
ryan[target]=0; //사용 하살 갯수 초기화
}
}
}
vector<int> solution(int n, vector<int> info) {
vector<int> ryanUse(11, 0); // 라이언 화살 사용 갯수
dfs(0, n, ryanUse, info);
if(answer[0]==-1){ //라이언이 이길 수 없는 경우
vector<int> a(1,-1);
return a;
}
return answer;
}