Fall in IT.

프로그래머스 코딩테스트 [완전탐색] - 숫자 야구 본문

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

     

    Comments