58청춘 2024. 9. 9. 23:54
728x90

문제

 

프로그래머스

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

programmers.co.kr

 

 

풀이

완전 탐색으로 라이언이 쏠 수 있는 모든 조합을 구했다. 구한 조합을 이용해 피치가 쏜 결과와 비교하며 최종 점수 차이를 계산해야 한다.

 

이때 얻은 점수 차이를 이용해 결과를 도출해야 하는데, 주의해야할 점들이 몇가지 있다.

첫 번째로 피치가 더 많은 점수를 얻거나 동점이면 피치의 승리이다. 두 번째, 라이언이 더 많은 점수를 얻는 조합 중 가장 낮은 점수를 더 많이 맞힌 경우를 리턴해야한다.

 

나는 두 번째 경우를 구현하는 것을 잊고 재출했다가 틀린 경험을 했다......

 

코드

const getComb = (arr, n, depth, sum) => {
  const result = [];

  if (depth === 10) return [[...arr, n - sum]];

  for (let i = 0; i <= n - sum; i++) {
    if (i + sum > n) break;
    const temp = getComb([...arr, i], n, depth + 1, sum + i);
    result.push(...temp);
  }
  return result;
};

const checkScore = (pArr, lArr) => {
  let pS = 0;
  let lS = 0;

  for (let i = 0; i < pArr.length; i++) {
    if (pArr[i] === 0 && lArr[i] === 0) continue;
    if (pArr[i] >= lArr[i]) pS += (10 - i);
    else lS += (10 - i);
  }
  return lS - pS;
};

const getLastNonZero = (arr) => {
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i] !== 0) return i;
  }
  return null;
};

const solution = (n, info) => {
  let answer = [];
  let sub = 0;
  const test = getComb([], n, 0, 0);

  for (let i = 0; i < test.length; i++) {
    const scoreSub = checkScore(info, test[i]);
    if (scoreSub <= 0) continue;
    if (scoreSub > sub) {
      answer = test[i];
      sub = scoreSub;
    }
    else if (scoreSub === sub) {
      const pN = getLastNonZero(answer);
      const nN = getLastNonZero(test[i]);
      if (pN < nN) answer = test[i];
      else if (pN === nN && answer[pN] < test[i][nN]) answer = test[i];
    }
  }
  return answer.length > 0 ? answer : [-1];
};
728x90