kiteday 님의 블로그

[프로그래머스-파이썬] 혼자서 하는 틱택토 본문

코딩테스트

[프로그래머스-파이썬] 혼자서 하는 틱택토

kiteday 2025. 11. 30. 17:42
반응형
SMALL

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

 

틱택토 문제이다.

1. 가로 세로 양방향 대각선을 기준으로 틱택토가 승리했는지 확인하는 코드와 (승리 시, 게임 즉시 종료) 2. 틱택토 조건을 오바하지 않았는지 확인하는 코드가 필요하다.

주의해야할 점은 틱택토의 빙고 개수가 2가 될 수 있단 점. 나는 처음부터 가로 세로 대각선에 조건을 충족하는지를 True와 False로 해서 크게 문제가 없었는데 많은 사람들이 개수로 체킹해서 이 점을 놓친다는 걸 알았다.

 

코드는 다음과 같다. 

def check_win(board, player):
    # 가로
    for i in range(3):
        if board[i][0] == player and board[i][1]==player and board[i][2]==player:
            return True
    
    # 세로
    for j in range(3):
        if board[0][j] == player and board[1][j]==player and board[2][j]==player:
            return True
    
    # 좌상 대각선
    flag = True
    for k in range(3):
        if board[k][k] != player:
            flag = False
    
    # 우하 대각선
    flag2 = True
    for l in range(3):
        if board[l][3-l-1] != player:
            flag2 = False
    
    if flag or flag2:
        return True
    else: return False
    

def solution(board):
    answer = 1
    
    board = [list(b) for b in board]
    
    count_o = sum(b.count('O') for b in board)
    count_x = sum(b.count('X') for b in board)
    o_win = check_win(board, 'O')
    x_win = check_win(board, 'X')
    
    
    if o_win and x_win :
        answer = 0
    if count_o < count_x or count_o > count_x + 1:
        answer = 0
    if o_win and not x_win and count_o == count_x:
        answer = 0
    if x_win and not o_win and count_o > count_x:
        answer = 0
    
    return answer
LIST