ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7682. [Python]틱택토
    Python_알고리즘/Gold V 2024. 4. 17. 21:08

    1. 문제

     

    https://www.acmicpc.net/problem/7682

     

    7682번: 틱택토

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

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 128MB
    • 구현

     

    3. 파이썬 코드

     

    while True:
        game = input()
        if game == "end":
            break
    
        game = list(map(str,game))
    
        circle = game.count("O")
        cross = game.count("X")
        dot = game.count(".")
        if circle > cross:
            print("invalid")
        else:
            if cross - circle > 1:
                print("invalid")
            else:
                matrix = [ game[:3], game[3:6], game[6:]]
                for i in range(3):
                    cross_flag = 0
                    circle_flag = 0
                    cross_check = 0
                    circle_check = 0
                    # 대각 선 범위 체크
                    if i == 0:
                        if matrix[i][0] == "X":
                            if matrix[i+1][1] == "X":
                                if matrix[i+2][2] == "X":
                                    cross_flag = 1
                        elif matrix[i][0] == "O":
                            if matrix[i+1][1] == "O":
                                if matrix[i+2][2] == "O":
                                    circle_flag = 1
                        if matrix[i][2] == "X":
                            if matrix[i+1][1] == "X":
                                if matrix[i+2][0] == "X":
                                    cross_flag = 1
                        elif matrix[i][2] == "O":
                            if matrix[i+1][1] == "O":
                                if matrix[i+2][0] == "O":
                                    circle_flag = 1
                        if matrix[i][0] == "X":
                            if matrix[i+1][0] == "X":
                                if matrix[i+2][0] == "X":
                                    cross_flag = 1
                        elif matrix[i][0] == "O":
                            if matrix[i+1][0] == "O":
                                if matrix[i+2][0] == "O":
                                    circle_flag = 1
                        if matrix[i][1] == "X":
                            if matrix[i+1][1] == "X":
                                if matrix[i+2][1] == "X":
                                    cross_flag = 1
                        elif matrix[i][1] == "O":
                            if matrix[i+1][1] == "O":
                                if matrix[i+2][1] == "O":
                                    circle_flag = 1
                        if matrix[i][2] == "X":
                            if matrix[i+1][2] == "X":
                                if matrix[i+2][2] == "X":
                                    cross_flag = 1
                        elif matrix[i][2] == "O":
                            if matrix[i+1][2] == "O":
                                if matrix[i+2][2] == "O":
                                    circle_flag = 1
                    # 가로 개수 체크
                    for j in range(3):
                        circle_check = matrix[j].count("O")
                        cross_check = matrix[j].count("X")
                        if circle_check == 3:
                            circle_flag = 1
    
                        if cross_check == 3:
                            cross_flag = 1
                    # X 빙고일 경우 O 빙고가 있는지 체크
                    if cross_flag == 1:
                        if circle_flag != 1:
                            # X 빙고의 경우 O의 개수가 작아야 하는거 체크
                            if cross > circle:
                                print("valid")
                            else:
                                print("invalid")
                        else:
                            print("invalid")
                        break
                    # O 빙고의 경우 X 빙고가 있는지 체크
                    if circle_flag == 1:
                        if cross_flag != 1:
                            # O 빙고의 경우 꽉차있는 경우 나올 수 없으므로 체크
                            if dot == 0:
                                print("invalid")
                            else:
                                #  꽉 차있지 않는 경우 X와 O의 개수가 같아야 하기 떄문에 체크
                                if cross == circle:
                                    print("valid")
                                else:
                                    print("invalid")
                        else:
                            print("invalid")
                        break
                else:
                    # 모든 경우를 통과했을때 꽉 차있는지 체크
                    if dot == 0:
                        if cross == 5 and circle == 4:
                            print("valid")
                            continue
                    print("invalid")

     

    4. 문제를 풀고난 후 생각

     

    • 구현 문제라서 별다른 설명이 없다.
    • 나올 수 있는 경우의 수를 모두 제거하는 방식으로 코드를 구현함.
    • X 빙고의 경우 O 의 빙고가 있는지, X의 개수가 O의 개수보다 많은지
    • O 빙고의 경우 X 의 빙고가 있는지, O의 개수가 X의 개수랑 같은지
    • 모든 경우를 통과했을때 X의 개수가 5개 O 의 개수가 4개 등 나올 수 있는 모든 경우를 제거함

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 구현

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    14284. [Python]간선 이어가기 2  (0) 2024.05.08
    7569. [Python]토마토  (0) 2024.04.25
    1456. [Python]거의 소수  (0) 2024.04.14
    1916. [Python]최소비용 구하기  (1) 2024.03.05
    2023. [Python] 신기한 소수  (1) 2024.02.25

    댓글

Designed by Tistory.