문제
숫자 야구 게임이란 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