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

고봉진·2023년 3월 11일
0

TIL/코딩테스트

목록 보기
11/27

아래의 경우들을 제외하고 1을 리턴합니다.

  1. X가 더 많거나 O가 X보다 2이상 크면 0 리턴

    1. X가 이겼을 때는 무조건 숫자가 같아야 한다.
    2. O가 이겼을 때는 O가 X보다 1 많아야 한다.
  2. O가 한줄, X도 한줄인 경우.

    (X가 두개의 대각선을 차지하는 경우는 1번에서 걸러짐)
    (O가 가로나 세로 여러줄을 차지하는 경우도 1번에서 걸러짐)
    (O가 가로한줄 세로한줄, 또는 대각선의 경우는 교차점이 마지막 착수점일 수 있으므로 패스. 이 경우에도 O 5개, X 4개여야 함.)

def solution(board):
    # 1. X가 더 많거나 O가 X보다 2이상 크면 0 리턴
    O, X = 0, 0
    for i in range(3):
        for j in range(3):
            if board[j][i] == 'O':
                O += 1
            elif board[j][i] == 'X':
                X += 1

    if not (0 <= O-X <= 1):
        return 0

    # 2. O in a row(or col) and X in a row(or col)
    o_row = False
    x_row = False
    for i in board:
        if i == 'OOO':
            o_row = True
        if i == 'XXX':
            x_row = True

    if o_row and x_row:
        return 0

    transposed = list(map(''.join, zip(*map(list, board))))

    o_col = False
    x_col = False
    for i in transposed:
        if i == 'OOO':
            o_col = True
        if i == 'XXX':
            x_col = True

    if o_col and x_col:
        return 0

    # 3. O in diagonals
    adjusted_board = []
    for i in range(3):
        adjusted_board.append(' '*i + board[i] + ' '*(2-i))

    adjusted_transposed = list(map(''.join, zip(*map(list, adjusted_board))))
    o_diag_1 = False
    x_diag_1 = False
    if adjusted_transposed[2] == 'OOO':
        o_diag_1 = True
    if adjusted_transposed[2] == 'XXX':
        x_diag_1 = True

    adjusted_board = []
    for i in range(3):
        adjusted_board.append(' '*(2-i) + board[i] + ' '*i)

    adjusted_transposed = list(map(''.join, zip(*map(list, adjusted_board))))
    o_diag_2 = False
    x_diag_2 = False
    if adjusted_transposed[2] == 'OOO':
        o_diag_2 = True
    if adjusted_transposed[2] == 'XXX':
        x_diag_2 = True

    # 1-1. X가 이겼을 때는 무조건 숫자가 같아야 한다.
    if x_col or x_row or x_diag_1 or x_diag_2:
        if O-X != 0:
            return 0

    # 1-2. O가 이겼을 때는 차이가 1이어야한다.
    if o_col or o_row or o_diag_1 or o_diag_2:
        if O-X != 1:
            return 0

    return 1
    
profile
이토록 멋진 휴식!

0개의 댓글