프로그래머스 LEVEL 2(혼자서 하는 틱택토)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2023-05-07

  • 해결 방법 :

    • 정상적으로 틱택토가 이뤄진 경우는 다음과 같다.

      1. O의 개수 - X의 개수는 0 또는 1이다.
      2. O가 이긴 경우, O의 개수는 X의 개수보다 1개 많다.
      3. X가 이긴 경우, O의 개수는 X의 개수와 같다.
      4. 둘 다 이긴 경우는 존재하지 않는다.
    • 따라서 board를 돌며 가로, 세로, 대각선을 확인해 O 또는 X가 이긴 경우를 확인

      • O와 X가 둘 다 1 이상인 경우, 정상적이지 않으므로 0 반환
      • O만 1 이상인 경우, O의 개수가 X의 개수보다 1개 많은 경우만 1, 나머지 0 반환
      • X만 1 이상인 경우, O의 개수가 X의 개수와 같은 경우만 1, 나머지 0 반환
      • 그 외의 경우 정상적이므로 1 반환
  • 회고 :

    • x
  • 코드

    const check = (board, ONum, XNum) => {
      const map = {
        O: 0,
        X: 0,
      };
    
      for (let i = 0; i < 3; i++) {
        if (board[i][0] === board[i][1] && board[i][1] === board[i][2] && board[i][0] !== '.') {
          map[board[i][0]] += 1;
        }
        if (board[0][i] === board[1][i] && board[1][i] === board[2][i] && board[0][i] !== '.') {
          map[board[0][i]] += 1;
        }
      }
    
      if (board[0][0] === board[1][1] && board[1][1] === board[2][2] && board[0][0] !== '.') {
        map[board[0][0]] += 1;
      }
      if (board[0][2] === board[1][1] && board[1][1] === board[2][0] && board[0][2] !== '.') {
        map[board[0][2]] += 1;
      }
    
      if (map.O > 0 && map.X > 0) return 0;
      else if (map.O > 0 && ONum !== XNum + 1) return 0;
      else if (map.X > 0 && ONum !== XNum) return 0;
    
      return 1;
    };
    
    function solution(board) {
      board = board.map((row) => row.split(''));
    
      const flattedBoard = board.flat();
      const ONum = flattedBoard.filter((v) => v === 'O').length;
      const XNum = flattedBoard.filter((v) => v === 'X').length;
    
      if (ONum - XNum < 0 || ONum - XNum > 1) {
        return 0;
      }
    
      return check(board, ONum, XNum);
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges