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

lemythe423·2023년 7월 30일
0
post-thumbnail

문제 링크

풀이

OXO
XOX
OXO

가로, 세로, 대각선에 같은 표시가 된 게 있어도 한쪽이 승리하고 게임이 끝난 거라면 잘못된 게 아니다. 테스트케이스만 보면 그렇게 판단해야 될 것 같은데 일부러 그렇게 유도한 것 같다.

예를 들어 위의 반례처럼 'O'가 승리했는데, O의 개수가 X의 개수보다 1개 더 많다면 위의 경우는 가능한경우다. O가 놓고 바로 종료되었기 때문에 X가 하나 덜 놓을 수 밖에 없기 때문.

이 문제에서는 순서는 상관없고 가능/불가능 여부만 판단하면 된다.

XXX
OOO
O..

X가 승리했고, O의 개수와 X의 개수가 같다. X가 승리하고 종료된 케이스이므로 이 경우도 가능한 경우다.

"""
!예외 상황

1. O의 개수가 X+1보다 크거나 같은 게 아닌 경우 
2. 누군가 이겼고 거기서 게임 진행이 종료된 경우
    - O가 이겼고 O의 개수 = X의 개수 + 1
    - X가 이겼고 O의 개수 = X의 개수
(예제에서처럼 누가 이긴다고 해서 무조건 실패한 경우는 아님)
"""


def solution(board):
    answer = -1
    
    # o,x의 개수 세기
    o = sum([row.count('O') for row in board])
    x = sum([row.count('X') for row in board])
    
    def check(lst):
        _set = set(lst)
        winner = ''
        if _set == {'O'}:
            winner = 'O'
        elif _set == {'X'}:
            winner = 'X'
        else:
            return False
        
        print(_set, o, x)
        if winner == 'O' and o != x+1:
            return True
        if winner == 'X' and o != x:
            return True
        return False
        
        
    # 불가능한 경우
    if o < x or o > x+1:
        return 0
    
    # 가로, 세로, 대각선을 비교하면서 2번 지켜지는지 확인
    dia1, dia2 = [], []
    for i in range(3):
        rows = board[i]
        cols = board[0][i]+board[1][i]+board[2][i]
        
        # 행, 열에 완성된 게 있고 경기가 제대로 진행된 건지 확인
        if check(rows) or check(cols):
            print(check(rows), check(cols))
            return 0
        
        dia1 += board[i][i]
        dia2 += board[i][2-i]
        
    if check(dia1) or check(dia2):
        return 0

    return 1
    
profile
아무말이나하기

0개의 댓글