기록

[programmers/java] 혼자서 하는 틱택토 - 시뮬레이션 본문

코딩테스트/Java

[programmers/java] 혼자서 하는 틱택토 - 시뮬레이션

zyin 2025. 6. 19. 07:52

문제 설명

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

 

입력은 3×3 크기의 문자열 배열로, 각 칸에는 'O', 'X', '.' 중 하나가 들어간다. 이때 해당 보드 상태가 규칙에 어긋나지 않는지 확인하여 유효하면 1, 불가능한 상태면 0을 반환해야 한다.


게임 규칙 요약

  1. 'O'가 선공이다.
  2. 한 번에 한 개의 돌만 둘 수 있다.
  3. 'O'의 개수는 'X'보다 같거나 하나 더 많아야 한다.
  4. 누군가 승리했다면 게임은 종료되어야 하며, 이후의 착수는 존재할 수 없다.
  5. 'O'와 'X'가 동시에 이긴 상태는 존재할 수 없다.

풀이 전략

  1. 보드에서 'O'와 'X'의 개수를 센다.
  2. 개수 조건을 위반하면 바로 0을 반환한다.
  3. 각각의 플레이어가 승리했는지 판별한다.
  4. 승리 조건과 개수 조건이 서로 충돌하지 않는지 확인한다.
  5. 모든 조건을 만족하면 1을 반환한다.

주요 코드

public int solution(String[] board) {
    int oCount = 0, xCount = 0;

    for (String row : board) {
        for (char c : row.toCharArray()) {
            if (c == 'O') oCount++;
            else if (c == 'X') xCount++;
        }
    }

    if (xCount > oCount || oCount - xCount > 1) return 0;

    boolean oWin = isWin(board, 'O');
    boolean xWin = isWin(board, 'X');

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

    return 1;
}

승리 조건 판별 함수

public boolean isWin(String[] board, char player) {
    for (int i = 0; i < 3; i++) {
        if (board[i].charAt(0) == player &&
            board[i].charAt(1) == player &&
            board[i].charAt(2) == player) return true;

        if (board[0].charAt(i) == player &&
            board[1].charAt(i) == player &&
            board[2].charAt(i) == player) return true;
    }

    if (board[0].charAt(0) == player &&
        board[1].charAt(1) == player &&
        board[2].charAt(2) == player) return true;

    if (board[0].charAt(2) == player &&
        board[1].charAt(1) == player &&
        board[2].charAt(0) == player) return true;

    return false;
}

 

Comments