현인
[프로그래머스] 양궁대회 with JS 본문
알고리즘 스프린트 6일차 - [프로그래머스] Lv 2. 양궁대회 (카카오 기출)
https://school.programmers.co.kr/learn/courses/30/lessons/92342?language=javascript
소요시간
1시간 40분... 문제 접근 실수 + 디버깅 으로 날린 시간 1시간
계획
처음에 브루트 포스로 가능한지 판단하는데 안될 거라고 판단해서 다른 방법 찾다가 다시 생각해보니 브루트 포스가 가능한 문제였다.....ㅠㅠ
풀이
10점 부터 0점까지 화살 n개로 표현할 수 있는 모든 경우의 수를 다 탐색하였다
- 하나의 경우 마다 점수 차이를 계산
- 라이언이 이긴 경우 최대 점수 차이랑 비교한다
- 최대 점수 차이가 같을 때는 더 낮은 점수의 더 많은 화살이 박힌 경우를 정답으로 반환한다
- 여기서 실수를 한 부분이 화살을 n개부터 0개까지 큰 점수부터 채워나가는 로직이라서 따로 비교를 안해주고 나중에 들어온 경우가 무조건 낮은 점수가 더 많이 맞은 결과라고 생각하여 계속 정답을 변경해주었다.
- 하지만 이 풀이는 두 개의 케이스를 통과하지 못했고,
- 결국 더 낮은 점수가 많은 결과를 반복을 통해 직접 계산하여 정답으로 변경해주니까 통과할 수 있었다.
- 무슨 케이스인지는 감이 안와서 참 여러모로 힘들었다
결과
코드
더보기
let len = 11;
let apeach = [];
let answer = [-1];
let maxDiff = 0;
var N = 0;
function sum(result){
let s = 0;
result.map(r => s += r);
return s;
}
function checkWin(result){
let r = 0;
let a = 0;
for(let i = 0; i < 10; i++){
if(apeach[i] == 0 && result[i] == 0){
continue;
}
if(apeach[i] >= result[i]) {
a += 10-i;
}
else{
r += 10-i;
}
}
return r-a;
}
function solution(n, info) {
var result = [0,0,0,0,0,0,0,0,0,0,0];
for (let i = 0; i < 11; i++){
apeach.push(parseInt(info[i]));
}
N = n;
perm(0, n, result);
return answer;
}
function perm(idx, n, result){
if(idx == len){
if(sum(result) == N){
let diff = checkWin(result);
if(diff > 0){
if (diff >= maxDiff){
if (diff > maxDiff){
maxDiff = diff;
answer = result.slice();
}
else{
for(let i = 10; i >= 0; i--){
if (result[i] > answer[i]){
answer = result.slice();
break;
}
else if (result[i] < answer[i]){
break;
}
else{
continue;
}
}
}
}
}
}
return;
}
for(let i = n; i >= 0; i--){
result[idx] = i;
perm(idx+1, n-i, result);
}
}
마치며
코드 진짜 너무 더럽게 짰고, 계획도 제대로 못세웠고 아주 엉망진창으로 풀어서 화가났다. 피곤한것도 한 몫 했지만 더 잘 할 수 있었을 것 같다. 이 문제는 다음에 한번 더 풀어봐야겠다...!
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 멀쩡한 사각형 with JS (0) | 2023.03.30 |
---|---|
[프로그래머스] 조이스틱 with JS (0) | 2023.03.30 |
[프로그래머스] 카카오 프렌즈 컬러링북 with Java (0) | 2023.03.29 |
[프로그래머스] 주차 요금 계산 with JS (0) | 2023.03.27 |
[프로그래머스] 두 큐 합 같게 만들기 with JS (0) | 2023.03.25 |