Algorithm
프로그래머스 코딩테스트 [완전탐색] - 숫자 야구
D.Y
2019. 12. 27. 16:05
반응형
문제 설명
숫자 야구 게임이란 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 함수를 작성해주세요.
제한사항
- 질문의 수는 1 이상 100 이하의 자연수입니다.
- baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
입출력 예
baseball / return
| [[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] | 2 |
코드
function solution(baseball) {
let answer = 0;
/**
* 1. 각자리수가 다른 모든 경우의 수를 만들어준다.
* - [123] ~ [987]까지
* 2. 모든 경우의 수 배열을 순회하면서 baseball의 case에 만족하는지 확인한다.
*/
// 1. 각자리수가 다른 모든 경우의 수를 만들어준다.
let allCase = [];
for (let i = 1; i <= 9; i++)
{
for (let j = 1; j <= 9; j++)
{
if (i === j)
continue;
for (let k = 1; k <= 9; k++)
{
if (j === k || i === k)
continue;
allCase.push(""+i+j+k);
}
}
}
// 2. 모든 경우의 수 배열을 순회하면서 baseball의 case에 만족하는지 확인한다.
for (let i = 0; i < allCase.length; i++)
{
let flag = true;
for (let j = 0; j < baseball.length; j++)
{
let str = baseball[j][0].toString();
let strike = 0;
let ball = 0;
// 스트라이크 & 볼 갯수 확인
for (let k = 0; k < str.length; k++)
{
if (str[k] === allCase[i][k])
strike++;
else
{
if (str.indexOf(allCase[i][k]) !== -1)
ball++;
}
}
if (strike === baseball[j][1] && ball === baseball[j][2])
continue;
else
{
flag = false;
break;
}
}
if (flag)
answer++;
}
return answer;
}
console.log(solution([[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]])); // 2
참조
https://programmers.co.kr/learn/courses/30/lessons/42841
반응형