프로그래머스 혼자서 하는 틱택토 JavaScript

2023년 2월 25일

프로그래머스 혼자서 하는 틱택토

문제 풀이

머쓱이가 혼자서 틱택톡을 할 때, 규칙을 어기는 실수를 했는지 확인하는 문제
규칙:

  • "O"를 표시할 차례인데 "X"를 표시하거나 반대로 "X"를 표시할 차례인데 "O"를 표시한다.
  • 선공이나 후공이 승리해서 게임이 종료되었음에도 그 게임을 진행한다.

이기는 조건은 가로, 세로, 대각선 중에 3개가 같은 표시가 만들어지는 것이다. 이겼는지 확인을 하기 위해 세로 방향을 확인하는 배열 x_arr, 가로 방향을 확인하는 배열 y_arr, 대각선을 확인하는 배열 slash_arr을 선언한다.

게임판의 정보를 위치에 맞게 배열들에 넣어주고 'O', 'X'의 개수를 구한다.
그다음 x_arr, y_arr, slash_arr을 조회해 이겼는지 확인한다.(oWin = true 'O' 승리, xWin = true 'X' 승리)

정상적이지 않은 틱택톡의 조건

  • O의 개수 < X의 개수
  • O의 개수 - X의 개수 > 1
  • O와 X 모두 승리한 경우
  • O가 승리했을 때, O가 X보다 한 개 더 많지 않은 경우
  • X가 승리했을 때, X와 O의 개수가 같지 않은 경우

해당 조건에 걸리면 정상적이지 않으므로 0을 리턴하고 조건에 걸리지 않으면 1을 리턴한다.

solution.js
function solution(board) {
    const board_arr = board.map((board) => board.split(''));

    const winCheck = (arr) => {
        let oCnt = 0, xCnt = 0, oWin = false, xWin = false;
        const y_arr = new Array(3).fill(0).map(() => new Array());
        const x_arr = new Array(3).fill(0).map(() => new Array());
        const slash_arr = new Array(3).fill(0).map(() => new Array());
    
        for (let i = 0; i < 3; i++) {
            for (let j = 0; j < 3; j++) {
                if (arr[i][j] === 'O') {
                    oCnt++;
                } else if (arr[i][j] === 'X') {
                    xCnt++;
                }
                // 가로 방향
                y_arr[i].push(arr[i][j]);
                // 세로 방향
                x_arr[j].push(arr[i][j]);
                // 왼쪽에서 오른쪽 대각선
                if (i === j) {
                    slash_arr[0].push(arr[i][j]);
                }
                // 오른쪽에서부터 왼쪽 대각선
                if (i + j === 2) {
                    slash_arr[1].push(arr[i][j]);
                }
            }
        }
    
        for (let i = 0; i < 3; i++) {
            if (
                y_arr[i].filter(x => x === 'O').length === 3 
                || x_arr[i].filter(x => x === 'O').length === 3 
                || slash_arr[i].filter(x => x === 'O').length === 3
                ) {
                oWin = true;
            }
            if (
                y_arr[i].filter(x => x === 'X').length === 3 
                || x_arr[i].filter(x => x === 'X').length === 3 
                || slash_arr[i].filter(x => x === 'X').length === 3
                ) {
                xWin = true;
            }
        }
    
        const diff = oCnt - xCnt;
    
        if (
            diff < 0 
            || diff > 1 
            || (oWin && xWin) 
            || (oWin && diff !== 1) 
            || (xWin && diff !== 0)
            )  {
            return 0;
        }

        return 1;
    }
    return winCheck(board_arr);
}

댓글