Coding Problem

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

Yepchani 2025. 2. 7. 15:58
반응형

문제

혼자서 하는 틱택토

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

 

 

풀이

설명

게임판이 규칙을 지켜서 틱택토를 진행했을 때 나올 수 있는 상황인지를 구하는 문제입니다.

 

규칙은 다음과 같습니다.

  • 선공이 "O", 후공이 "X"를 번갈아가면서 빈칸에 표시합니다.
  • 한 줄이 같은 문양으로 채워지면 해당 플레이어의 승리로 게임을 종료합니다.

 

다음과 같은 상황은 무효처리됩니다.

  • 자신의 차례가 아닌데 플레이한 경우
  • 한 플레이어의 승리로 게임이 종료되었음에도 그 게임을 진행한 경우

 

위 사항들을 고려했을 때, 올바른 게임판의 조건은 다음과 같습니다.

  • O의 개수는 X의 개수와 같거나 하나 더 많아야 합니다.
  • 선공과 후공 둘 중 하나만 승리할 수 있습니다.
  • 선공이 승리한 경우, O의 개수는 X의 개수보다 하나 더 많아야 합니다.
  • 후공이 승리한 경우, X의 개수는 O의 개수와 같아야 합니다.

 

예시 코드

function solution(board) {
  let oCount = 0;
  let xCount = 0;

  for (const row of board) {
    for (const col of row) {
      if (col === "O") oCount++;
      else if (col === "X") xCount++;
    }
  }

  const oWin = isWinning("O");
  const xWin = isWinning("X");

  if (
    xCount > oCount ||
    oCount > xCount + 1 ||
    (oWin && xWin) ||
    (oWin && oCount === xCount) ||
    (xWin && oCount !== xCount)
  )
    return 0;

  return 1;

  function isWinning(player) {
    return (
      (board[0][0] === player &&
        board[0][1] === player &&
        board[0][2] === player) ||
      (board[1][0] === player &&
        board[1][1] === player &&
        board[1][2] === player) ||
      (board[2][0] === player &&
        board[2][1] === player &&
        board[2][2] === player) ||
      (board[0][0] === player &&
        board[1][0] === player &&
        board[2][0] === player) ||
      (board[0][1] === player &&
        board[1][1] === player &&
        board[2][1] === player) ||
      (board[0][2] === player &&
        board[1][2] === player &&
        board[2][2] === player) ||
      (board[0][0] === player &&
        board[1][1] === player &&
        board[2][2] === player) ||
      (board[0][2] === player &&
        board[1][1] === player &&
        board[2][0] === player)
    );
  }
}