반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

프로그래머스) 양궁대회 JS 본문

코딩테스트 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 포인트에 넣어주면 된다.

728x90
반응형
Comments