코딩테스트 with JS/백준, 프로그래머스
프로그래머스) 양궁대회 JS
5_hyun
2023. 1. 15. 21:39
반응형
양궁대회
https://school.programmers.co.kr/learn/courses/30/lessons/92342
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
function solution(n, info) {
var answer = [];
let maxPoint = 0;
let dy = Array.from({ length: 11 }, () => 0);
function DFS(point, count, a_sum, r_sum, ary) {
if (n < count) return;
if (point > 10) {
let diff = r_sum - a_sum;
if (diff > maxPoint) {
ary[10] = n - count;
maxPoint = diff;
answer = ary;
}
return;
}
// 라이언이 점수 먹음
if (n > count) {
let temp = ary.slice();
temp[10 - point] = info[10 - point] + 1;
DFS(point + 1, count + info[10 - point] + 1, a_sum, r_sum + point, temp);
}
// 어피치가 점수 먹음
if (info[10 - point] > 0) {
DFS(point + 1, count, a_sum + point, r_sum, ary.slice());
} else {
// 둘 다 못 먹음
DFS(point + 1, count, a_sum, r_sum, ary.slice());
}
}
DFS(0, 0, 0, 0, dy.slice());
if (answer.length > 0) return answer;
else return [-1];
}
해결 방법
이 문제를 처음에 DFS를 활용하여 풀어야겠다는 생각은 했다. 하지만 세부 조건을 파악하지 못했다.
1. 라이언이 점수를 먹은 경우, 2. 어피치가 점수를 먹은 경우 || 둘 다 못 먹은 경우
이렇게 생각을 하고 문제 풀이를 해야 했는데 둘 다 못 먹은 경우에 대해서 생각하지 못했다.
위 풀이에서 point는 현재 비교할 점수, count는 라이언이 쏜 누적 횟수, a_sum은 어피치 총합 점수, r_sum은 라이언 총합 점수, ary는 라이언이 0~10 포인트를 몇 번 맞췄는지에 대한 배열이다.
점수 차이가 같으면 낮은 점수를 더 많이 맞춘 경우를 리턴해야 해서 낮은 점수부터 비교하면된다. 그러다가 10 포인트까지 다 비교하면 라이언의 총 횟수와 쏜 발의 개수인 n을 10 포인트에 넣어주면 된다.
반응형