구현, 조건 분기 - 7682번: 틱택토

jisu_log·2025년 6월 15일

알고리즘 문제풀이

목록 보기
43/105


고려해야 할 조건들

(X가 먼저 수를 두고, 서로 번갈아 둔다.)
종료 조건: 3칸 잇는 순간 종료, 게임판이 가득차도 종료.
1) X, O가 동시에 우승하는 경우 -> invalid
2) X 우승 시 -> 무조건 X 개수가 O 개수보다 1개 더 많아야 함 -> valid
3) O 우승 시 -> 무조건 X 개수와 O 개수가 동일해야 함 -> valid
4) 한 줄도 완성된 게 없어도, 게임판이 꽉 찼다면 -> 무조건 X 개수가 O 개수보다 1개 더 많아야 함 -> valid

line = list(input())

while line[0] != "e":

    find_cnt = 0
    x_cnt = line.count("X")
    o_cnt = line.count("O")
    x_win = False
    o_win = False

    # 가로 3줄 확인
    for i in range(0, 7, 3):
        start = line[i]
        if start == ".":
            continue

        for j in range(i, i + 3):
            if line[j] != start:
                break
        else:
            find_cnt += 1
            if start == "X":
                x_win = True
            else:
                o_win = True

    # 세로 3줄 확인
    for i in range(0, 3):
        start = line[i]
        if start == ".":
            continue

        for j in range(i, i + 7, 3):
            if line[j] != start:
                break
        else:
            find_cnt += 1

            if start == "X":
                x_win = True
            else:
                o_win = True

    # 대각선 확인(왼 -> 오)

    start = line[0]
    for i in range(4, 9, 4):
        if start == ".":
            break

        if line[i] != start:
            break
    else:
        find_cnt += 1

        if start == "X":
            x_win = True
        else:
            o_win = True

    # 대각선 확인(오 -> 왼)
    start = line[2]
    for i in range(4, 7, 2):
        if start == ".":
            break

        if line[i] != start:
            break
    else:
        find_cnt += 1

        if start == "X":
            x_win = True
        else:
            o_win = True

    # 누적 카운트 체크
    if find_cnt >= 1:  # 한 줄 이상 완성 시

        if x_win and o_win:  # 둘 다 동시에 승리 불가능
            print("invalid")
        elif x_win and x_cnt - o_cnt == 1:  # x 승리 시 1 차이나야 정상
            print("valid")
        elif o_win and x_cnt - o_cnt == 0:  # o 승리 시 0 차이나야 정상
            print("valid")
        else:
            print("invalid")
    else:  # 한 줄도 완성 안된 경우

        # 게임판이 가득 찬 경우
        if (
            "." not in line and x_cnt - o_cnt == 1
        ):  # 아무도 이긴 사람이 없는 경우, x가 하나 더 많아야 정상
            print("valid")
        else:
            print("invalid")

    line = list(input())

0개의 댓글