[프로그래머스] 숫자 야구 javascript

[완전탐색] level2 숫자 야구

javascript

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

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

입출력 예
baseballreturn
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]2

코드
function solution(baseball) {
    let answer = 0;
    const len = baseball.length;
    
    //123~987까지의 숫자 중 정답가능성이 있는 숫자를 찾는다.
    for (let i = 123; i <= 987; i++) {
        const number = i+"";
        //중복되는 숫자, 십의자리/일의 자리에 0이 존재하는 경우는 건너뛴다.
        if (number.charAt(0) == number.charAt(1) || number.charAt(1) == number.charAt(2) || number.charAt(2) == number.charAt(0) || number.charAt(1) == "0" || number.charAt(2) == "0")
            continue;
        
        let bflag = true;
        //사용자가 질문한 배열에 현재의 숫자를 대입하여 동일한 결과를 얻는지 체크한다.
        for (let j = 0; j < len; j++) {
            const callNumber = baseball[j][0]+"";
            const strike = baseball[j][1];
            const ball = baseball[j][2];
            
            //strike 체크
            let countStrike = 0;
            for (let k = 0; k < 3; k++) {
                if (number.charAt(k) === callNumber.charAt(k)) countStrike++;
            }
            
            if (countStrike !== strike) {
                bflag = false;
                break;
            } 
            //ball 체크
            let countBall = 0;
            for (let k = 0; k < 3; k++) {
                if (number.indexOf(callNumber.charAt(k)) !== -1) countBall++;
            }
            
            //strike가 체크 된 경우 ball을 판단할 때 체크되므로 제외시켜 주어야 한다.
            if (countBall - countStrike !== ball) {
                bflag = false;
                break;
            }
        }
        
        if (bflag) answer++;
    }
    
    return answer;
}

댓글