현인

[프로그래머스] 양궁대회 with JS 본문

알고리즘

[프로그래머스] 양궁대회 with JS

현인(Hyeon In) 2023. 3. 29. 00:28

알고리즘 스프린트 6일차 - [프로그래머스] Lv 2. 양궁대회 (카카오 기출)

https://school.programmers.co.kr/learn/courses/30/lessons/92342?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

소요시간

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);
    }
}

 

마치며

코드 진짜 너무 더럽게 짰고, 계획도 제대로 못세웠고 아주 엉망진창으로 풀어서 화가났다. 피곤한것도 한 몫 했지만 더 잘 할 수 있었을 것 같다. 이 문제는 다음에 한번 더 풀어봐야겠다...!

반응형