티스토리 뷰

반응형
프로그래머스 혼자서 하는 틱택토 Python 풀이

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



문제

틱택토 게임판이 주어졌을 때, 이 게임판이 실제 규칙을 지켜서 진행된 상황일 수 있는지를 판별하는 문제입니다.
  • 선공은 항상 `"O"`
  • 후공은 `"X"`
  • 같은 표시가 가로, 세로, 대각선으로 3개 연속 나오면 게임이 끝남
  • 게임이 끝났는데도 말을 더 두는 경우는 불가능
  • `"O"`와 `"X"`의 개수 차이는 최대 1만 가능


테스트케이스

board 결과 설명
["O.X", ".O.", "..X"] 1 번갈아 두었을 때 나올 수 있는 정상 게임판
["OOO", "...", "XXX"] 0 O가 이긴 시점에 게임이 끝났어야 함
["...", ".X.", "..."] 0 O 없이 X만 있으므로 불가능
["...", "...", "..."] 1 시작하기 전 빈 게임판


문제 작동원리

  1. 개수 규칙 검사
    • 항상 \(cnt_X \le cnt_O \le cnt_X+1\) 여야 함
  2. 승리 판정
    • O가 승리했다면 → \(cnt_O == cnt_X+1\) 이어야 함
    • X가 승리했다면 → \(cnt_O == cnt_X\) 이어야 함
    • O와 X가 동시에 승리하는 경우는 불가능
  3. 승리자가 없는 경우
    • 개수 규칙만 맞으면 정상적인 진행으로 인정


아이디어

  • check_O(board, player) 함수를 만들어 특정 플레이어(O, X)가 승리했는지 판별
  • 말 개수를 세고, 개수 규칙 위반 여부 확인
  • 승리 상황과 개수 관계를 함께 검사
  • 조건을 통과하면 1, 그렇지 않으면 0 반환


전체코드

def check_O(arr, ans):
    for i in range(3):
        if arr[i][0]==arr[i][1] and arr[i][1]==arr[i][2] and arr[i][2]==ans:
            return True
    for i in range(3):
        if arr[0][i]==arr[1][i] and arr[1][i]==arr[2][i] and arr[2][i]==ans:
            return True
    if arr[0][0] == arr[1][1] and arr[1][1]==arr[2][2] and arr[2][2]==ans:
        return True
    if arr[0][2]==arr[1][1] and arr[1][1]==arr[2][0] and arr[2][0]==ans:
        return True
    return False

def solution(board):
    cnt_O = 0
    cnt_X = 0
    for i in range(3):
        for j in range(3):
            if board[i][j] == 'O':
                cnt_O += 1
            elif board[i][j] == 'X':
                cnt_X += 1

    o_win = check_O(board, 'O')
    x_win = check_O(board, 'X')

    if cnt_X > cnt_O or cnt_O > cnt_X+1: # 말 개수 규칙 위반
        return 0
    elif o_win and x_win: # 동시에 승리 → 불가능
        return 0
    elif o_win and cnt_O == cnt_X+1: # O 승리
        return 1
    elif x_win and cnt_O == cnt_X: # X 승리
        return 1
    elif not o_win and not x_win: # 승부 안 난 경우
        return 1
    else: # 나머지는 불가능
        return 0


결론

이 문제의 핵심은 **개수 규칙**과 **승리 조건의 정합성**을 동시에 맞추는 것입니다.
  • 단순히 승리 여부만 체크하는 것이 아니라, **승리했을 때 말 개수가 규칙에 맞는지**까지 확인해야 합니다.
  • 조건을 제대로 걸러주면 정상적인 게임판은 1, 불가능한 게임판은 0을 정확히 판별할 수 있습니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형