숫자야구 javascript - 프로그래머스

노요셉·2019년 10월 17일
0

PS

목록 보기
1/8
post-custom-banner

code

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라는 함수를 통해 완전탐색할때 의미없는 경우는 스킵해줬습니다.

profile
서로 아는 것들을 공유해요~
post-custom-banner

0개의 댓글