DM Log

[코딩테스트 연습] 혼자서 하는 틱택토 - Python 본문

알고리즘/프로그래머스

[코딩테스트 연습] 혼자서 하는 틱택토 - Python

Dev. Dong 2025. 1. 12. 16:04

문제링크  - https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제 간단 요약]

1. 3*3 빈칸에 선공이 O 후공이 X를 표시하여 먼저 가로, 세로, 대각선 중 한 줄이 같게 입력되면 승리하는 게임

2. 주어진  board가 게임에서 나타날 수 있는 현상 인지 확인 하는 문제

 

[문제 해결 방안]

1. board가 나올 수 없는 조건을 찾아 문제 해결

2. 조건 (나올 수 없는 조건)

    1) o가 선공 이기 때문에 x의 갯수가 o의 갯수보다 큰 경우

    2) o의 갯수와 x의 갯수가 2개 이상 차이가 나는 경우

    3) 가로, 세로, 대각선이 같게 입력되는 값이 o, x 둘다 있는 경우

    4) o가 가로, 세로, 대각선이 같게 입력 되는게 있을 때 o의 갯수가 x의 갯수보다 1개 많지 않는 경우

    5) x가 가로, 세로, 대각선이 같게 입력 되는거 있을 때 x의 갯수와 x의 갯수가 같지 않는 경우

 

[문제 해결 코드 - Python]

def check_win_cnt(board,check):
    check_cnt = 0
    # 가로
    for i in range(3):
        if board[i] == check*3:
            check_cnt += 1
    # 세로
    for i in range(3):
        word = ''
        for j in range(3):
            word += board[j][i]
        if word == check*3:
            check_cnt += 1
    # 대각선
    word = ''
    word = board[0][0]+board[1][1]+board[2][2]
    if word == check*3:
        check_cnt += 1
    # 역 대각선
    word = ''
    word = board[0][2]+board[1][1]+board[2][0]
    if word == check*3:
        check_cnt += 1
    
    return check_cnt

def solution(board):
    o_cnt=0
    x_cnt=0
    o_check_cnt = 0
    x_check_cnt = 0
    for i in range(3):
        for j in range(3):
            if board[i][j]=='O':
                o_cnt += 1
            elif board[i][j]=='X':
                x_cnt += 1
    if o_cnt < x_cnt or o_cnt - x_cnt > 1:
        return 0

    o_check_cnt = check_win_cnt(board,'O')
    x_check_cnt = check_win_cnt(board,'X')
    if o_check_cnt > 0 and x_check_cnt > 0:
        return 0
    elif o_check_cnt > 0:
        if o_cnt != x_cnt + 1:
            return 0
    elif x_check_cnt > 0:
        if o_cnt != x_cnt:
            return 0

    return 1