function solution(baseball) {
var answer = 0;
let hubo = new Array(1000)
.fill()
.map( value => false);
function isNotOk (number) {
let res = false;
let check = {};
const numberStrings = String(number).split("");
for(const element of numberStrings){
if(element === "0"){
res = true;
break;
}
if( !check[element] ){
check[element] = true;
}else{
res = true;
break;
}
}
return res;
}
for(let possibleNumber = 123; possibleNumber<1000; possibleNumber++){
if( isNotOk(possibleNumber) ){
continue;
}
let count = 0;
for(const question of baseball){
let currentStrike = 0;
let currentBall = 0;
const number = question[0];
const strike = question[1];
const ball = question[2];
const numberStrings = String(number).split("");
const currentStrings = String(possibleNumber).split("");
for(let i = 0; i< currentStrings.length; i++){
for(let j =0 ; j< numberStrings.length; j++){
if( currentStrings[i] === numberStrings[j] && i === j){
currentStrike+=1;
}
if( currentStrings[i] === numberStrings[j] && i !== j){
currentBall+=1;
}
}
}
if( currentStrike === strike && currentBall === ball ){
count++;
}
// if( possibleNumber === 324){
// console.log(count);
// }
if( count === baseball.length ){
hubo[possibleNumber] = true;
}else{
hubo[possibleNumber] = false;
}
}
}
for( let possibleNumber = 123; possibleNumber < 1000; possibleNumber++ ){
if( hubo[possibleNumber] ){
// console.log(possibleNumber);
answer += 1;
}
}
return answer;
}
123 ~ 987
328
hubo = [1000개] false
가능한 모든 수의 check배열을 만듭니다.
true이면 숫자야구에서 정답인 수입니다.
123 - 1스트라이크 , 1볼 true , 아니면 false
356 - 1스트라이크 , 0볼 true , 아니면 false
327 - 2스트라이크 , 0볼 true , 아니면 false
489 - 0스트라이크 , 1볼 true , 아니면 false
어떻게 스트라이크 볼을 판단할 것인가?
strike = 0
ball = 0
라는 변수를 만들어서 strike, ball의 횟수를 저장해줘야죠.
다음과 같이 각자리수를 쪼개는 작업도 필요합니다.
arr1 3, 2, 8
arr2 1, 2, 3
123 ~ 987 여기서 true가 몇개인지?
를 통해서 가능한 정답의 수를 내뱉게됩니다.
위에 계획한대로 구현했다면, 정확도가 60% 였습니다.
문제의 조건은 3자리수가 각 자리수에 위치할 수 있는 수가
각각 다른 1~9 사이의 수입니다.
완전탐색을 할 환경을 덜 많들어준것이죠.
isNotOk라는 함수를 통해 완전탐색할때 의미없는 경우는 스킵해줬습니다.