LEVEL2_프로그래머스_숫자 야구

Written on September 25, 2019

문제

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

* 숫자는 맞지만, 위치가 틀렸을 때는 볼
* 숫자와 위치가 모두 맞을 때는 스트라이크
* 숫자와 위치가 모두 틀렸을 때는 아웃

예를 들어, 아래의 경우가 있으면

A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.

질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

풀이

function solution(baseball) {
  let count = 0;
  const getStrike = (num1, num2) => {
    let count = 0;
    for (let i = 0; i < 3; i++) {
      if (num1[i] === num2[i]) {
        count++;
      }
    }
    return count;
  };
  const getBall = (num1, num2) => {
    let count = 0;
    for (let i = 0; i < 3; i++) {
      if (num2.includes(num1[i]) && num1[i] !== num2[i]) {
        count++;
      }
    }
    return count;
  };
  const countPossibleNums = numStr => {
    if (numStr.length === 3) {
      let isPossible = true;
      for (let i = 0; i < baseball.length; i++) {
        let baseballNumStr = baseball[i][0].toString();
        if (getStrike(numStr, baseballNumStr) === baseball[i][1]) {
          if (getBall(numStr, baseballNumStr) === baseball[i][2]) {
          } else {
            isPossible = false;
          }
        } else {
          isPossible = false;
        }
      }
      if (isPossible) {
        count++;
      }
      return;
    }
    for (let i = 1; i <= 9; i++) {
      if (!numStr.includes(i)) {
        countPossibleNums(numStr + i);
      }
    }
  };
  countPossibleNums("");
  return count;
}


문제바로가기

숫자 야구

👩🏻‍💻 배우는 것을 즐기는 프론트엔드 개발자 입니다
부족한 블로그에 방문해 주셔서 감사합니다 🙇🏻‍♀️

in the process of becoming the best version of myself