[알고리즘문제] 혼자서 하는 틱택토

단간단간·2024년 4월 30일
0

알고리즘 문제

목록 보기
92/106

문제 링크:

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

회고:

  • 규칙을 실수한 케이스에 대해서 먼저 차례대로 정리한 것
  • 선공 후공 순서, 선공은 최대 5번 놓을 수 있고 후공은 최대 4번 놓을 수 있다는 점 등을 참고해서, 나름 실수 케이스도 순서에 맞춰 구성하긴 했는데 그때 그때 필요한 케이스를 짜집어 넣어서 소스코드가 깔끔하진 못했다.
  • 문득 하나의 함수에 return이 다수 존재하면 ISMS 심사에 걸렸던 게 생각났다.

python

# 선공 O, 후공 X, 서로 번갈아가면서 표시
# 가로, 세로, 대각선 등 3개가 같은 표시가 만들어지면 승리

# 규칙 실수
# 1. O를 표시할 차례인데 X를 표시하거나 혹은 그 반대
# 2. 누군가 이미 승리해서 게임이 종료된 상태인데도 계속 게임을 진행하는 경우
def solution(board):
    count_O = 0
    count_X = 0
    bingo_count = {"O": 0, "X": 0}

    for array in board:
        count_O += array.count("O")
        count_X += array.count("X")

    if count_O not in (count_X, count_X + 1):
        return 0

    # 가로로 같은 표시 만들어지는지 확인
    count = 0
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] != ".":
            bingo_count[board[i][0]] += 1
            count += 1

    if count > 1:
        return 0

    # 세로로 같은 표시 만들어지는지 확인
    count = 0
    for j in range(3):
        if board[0][j] == board[1][j] == board[2][j] != ".":
            bingo_count[board[0][j]] += 1
            count += 1

    if count > 1:
        return 0

    # 대각선으로 같은 표시 만들어지는지 확인
    if board[0][0] == board[1][1] == board[2][2] != "." or board[0][2] == board[1][1] == board[2][0] != ".":
        bingo_count[board[1][1]] += 1

    # "O"가 이긴 경우엔 "O" 개수가 "X" 개수보다 많아야 함
    # "X"가 이긴 경우엔 "O" 개수와 "X" 개수가 같아야 함
    if (bingo_count["O"] > 0 and count_O <= count_X) or (bingo_count["X"] > 0 and count_O != count_X):
        return 0
    else:
        return 1


if __name__ == "__main__":
    result = solution(["XXO", ".OX", "O.."])
    print(result)
0
profile
simple is best

0개의 댓글