일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- app router
- 이분 검색
- Promise
- 반공변성
- CORS
- 투포인터
- autosize
- CI/CD
- 결정 알고리즘
- 인터섹션
- recoil
- 호이스팅
- webpack
- TS
- 무한 스크롤
- RTK Query
- map
- useAppDispatch
- async/await
- 타입 좁히기
- dfs
- 태그된 유니온
- 리터럴 타입
- tailwind
- ESlint
- SSR
- Jest
- 공변성
- React
- Cypress
Archives
- Today
- Total
짧은코딩
프로그래머스) 양궁대회 JS 본문
반응형
양궁대회
https://school.programmers.co.kr/learn/courses/30/lessons/92342
코드
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 포인트에 넣어주면 된다.
반응형
'코딩테스트 with JS > 백준, 프로그래머스' 카테고리의 다른 글
프로그래머스) 택배 배달과 수거하기 (0) | 2023.02.09 |
---|---|
프로그래머스) 이모티콘 할인행사 (0) | 2023.02.07 |
프로그래머스) 개인정보 수집 유효기간 JS (0) | 2023.01.19 |
프로그래머스) k진수에서 소수 개수 구하기 JS (1) | 2023.01.06 |
프로그래머스) 두 큐 합 같게 만들기(투포인터) JS (0) | 2022.12.12 |
Comments