문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/92342
using System;
public class Solution {
public int[] rarray = new int[11]; //라이언 배열
public int[] aarray = new int[11]; // 어피치 배열(= 문제에서 info)
public int N = 0; // 화살갯수 (문제에서 n )
public int diff = 0; // 모든 경우의 수 점수차이 중 최댓값
public int[] answer = new int[11];
public int[] solution(int n, int[] info) {
aarray = info;
N = n;
dfs(0,0);
if (diff == 0)
{
answer = new int[1]{-1};
}
return answer;
}
public void dfs(int n, int info)
{
if (n == N) //화살 모두 사용
{
int ascore = 0; // 어피치 스코어
int rscore = 0; // 라이언 스코어
//점수 계산
for (int i = 0; i < 11; i++)
{
if(aarray[i] == rarray[i] && rarray[i] == 0) continue; //** 둘 다 못쏘면 점수 반영이 되지 않아야함
if(aarray[i] >= rarray[i])
{
ascore += 10 - i;
}
else
{
rscore += 10 - i;
}
}
//점수 차가 갱신되면 정답 배열을 바꿔줘야함
if ( diff < rscore - ascore)
{
diff = rscore - ascore;
for (int i = 0; i< 11; i++)
answer[i] = rarray[i];
}
// 만약 기존 점수차값과 같으면 낮은점수를 많이쏜 배열로 바꾸어 줘야함
else if (diff == rscore - ascore )
{
for (int j = 0; j < 11 ; j++)
{
if(answer[10-j] < rarray[10-j])
{
for (int i = 0; i< 11; i++)
answer[i] = rarray[i];
break;
}
else if(answer[10-j] > rarray[10-j]) // ** 만약 기존 정답이 더 낮은 점수를 많이 쐇으면 루프를 빠져 나와야함 (갱신하면 안됨) 8,18번 오답 부분
break;
}
}
}
for (int i = info; i < 11; i++)
{
if(aarray[i] >= rarray[i])
{
rarray[i]++;
dfs(n+1,i);
rarray[i]--;
}
}
}
}
너무 좋은 글이네요. 공유해주셔서 감사합니다.