프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 7682 틱택토 Python

중규리 2024. 2. 2. 16:47

🐸 문제 정보

 

7682번: 틱택토

틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고

www.acmicpc.net

 

🤖 알고리즘

구현

 

⏱️ 풀이 시간

47.05m

 

📝 풀이

완전 대기업 코테에서 나올 것 같은 문자열 + 빡구현 문제였다...! 좋은 문제인둣...!

조건을 나눠서 그에 맞게 구현하면 되는 문제이다.

  1. 각 판에서 x는 5개, o는 4개가 최대이며, 이보다 더 많이 있다면 무조건 invalid
  2. x가 먼저 시작하기 때문에, x가 o보다 1개 많거나 같아야한다.
    • x가 o와 같은 개수라면, o가 이기는 경우로 끝나야 유효하다.
    • x가 o보다 1개 더 많다면, x가 이기는 경우로 끝나거나 비겼지만 가득 찬 경우로 끝나야 유효하다.
  3. 이 과정에서 이기는 경우란, 아래와 같다.
    • 이겨야하는 문자가 한 행을 가득 채운다
    • 이겨야하는 문자가 한 열을 가득 채운다
    • 이겨야하는 문자가 한 대각선을 가득 채운다

 

대각선 검사하기... 빡셌다.

 

🧑‍💻 나의 답

# pypy3

import sys
input = sys.stdin.readline

def is_finish(winner):
    key = winner + winner + winner
    if key in [''.join(row) for row in board]: # 행 검사
        return True
    if key in [''.join([row[i] for row in board]) for i in range(3)]: # 열 검사
        return True
    if key in [''.join([board[i][i] for i in range(3)]), ''.join([board[j][abs(j - 2)] for j in range(3)])]: # 대각선 검사
        return True
    return False

def is_valid(x, o):
    if (x > 5) or (o > 4):
        print('invalid')
        return
    valid = False
    of, xf = is_finish('O'), is_finish('X')
    if x == o: # O가 이겨야함
        if of and (not xf):
            valid = True
    elif (x - 1) == o: # X가 이기거나 / 둘다 못이겼지만 가득차야함
        if xf and (not of):
            valid = True
        elif (not of) and (not xf):
            if not any('.' in row for row in board):
                valid = True
    if valid:
        print('valid')
    else:
        print('invalid')

while True:
    board = input().rstrip()
    if board == 'end': break
    x, o = board.count('X'), board.count('O')
    board = [list(board[i:i+3]) for i in range(0, 7, 3)]
    is_valid(x, o)