완전탐색_숫자야구

Feb 24th 2020 by jyoon

문제

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

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

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

    예를 들어, 아래의 경우가 있으면
    A : 123
    B : 1스트라이크 1볼.    //123 중 2개 숫자, 1개는 자리까지 맞음
    A : 356
    B : 1스트라이크 0볼.    //3XX확신 (위숫자에서 겹치는게 3뿐이라서)/ 1,2숫중 1개는 볼
    A : 327
    B : 2스트라이크 0볼.    //32X확신 (3은 두번째서 고정, 그렇다면 첫,두번째에서 1개 볼인데 겹치는수가 2)
    A : 489
    B : 0스트라이크 1볼.    //마지막자리 빼고 확정이기 때문에 이런 경우 첫번째 두번째 자리숫자가 볼의 대상이된다. 그래서 324, 328이 답이된다.
    이때 가능한 답은 324와 328 두 가지입니다.

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

제한사항

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수]를 담고 있습니다.

입출력 예

baseball	                                            return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]	2

해결 방법

  • for문 2개

    • outer for: 예상할 수 있는 3자리 숫자 Array
    • inner for: 예상 정답 Array
  • 가능 정답 찾기 로직

    • 위 for문을 돌면서 2번 예상 정답 Array안에서 찾기
    • strike, ball 인경우를 조건문으로 찾는다.

STEP

CODE

function solution(baseball) {
  var answer = 0

  // 서로 다른 3개의 수 조합.
  for (let i = 123; i <= 987; i++) {
    let [x, y, z] = (i + "").split("")

    // 서로 다른 3개 수 조합을 만들기 위해서
    if (x === "0" || y === "0" || z === "0") continue
    if (x === y || x === z || y === z) continue

    for (let j = 0; j < baseball.length; j++) {
      let strike = 0
      let ball = 0

      //query: 던진 숫자
      //query_s: query_strike
      //query_b: query_ball
      const [query, query_s, query_b] = baseball[j]
      const [query_x, query_y, query_z] = (query + "").split("")
      if (query_x === "0" || query_y === "0" || query_z === "0") break
      if (query_x === query_y || query_x === query_y || query_y === query_z)
        break

      if (x === query_x) strike++
      if (y === query_y) strike++
      if (z === query_z) strike++
      if (query_s != strike) break

      if (x === query_y || x === query_z) ball++
      if (y === query_x || y === query_z) ball++
      if (z === query_x || z === query_y) ball++
      if (query_b != ball) break

      if (j === baseball.length - 1) answer++
    }
  }
  return answer
}

console.log(
  solution([
    [123, 1, 1],
    [356, 1, 0],
    [327, 2, 0],
    [489, 0, 1],
  ])
) //2

정답

2