728x90
반응형
https://www.acmicpc.net/problem/7682
문제
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 두 번째 사람이 O를 놓는다. 어느 때든지 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공하면 게임은 즉시 끝난다. 게임판이 가득 차도 게임은 끝난다.
게임판의 상태가 주어지면, 그 상태가 틱택토 게임에서 발생할 수 있는 최종 상태인지를 판별하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입력의 마지막에는 문자열 "end"가 주어진다.
출력
각 테스트 케이스마다 한 줄에 정답을 출력한다. 가능할 경우 "valid", 불가능할 경우 "invalid"를 출력한다.
풀이
Code
import sys
input = sys.stdin.readline
# 1. 게임 유효성 검사 함수 정의
def game_validation(board) :
# 1-1. 말 수 체크 함수 정의
def check_piece() :
# 1-1-1. 각 말의 수 반환
piece = {"X" : 0, "O" : 0}
for i in range(3) :
for j in range(3) :
if board[i][j] == "." : continue
piece[board[i][j]] += 1
return piece["X"], piece["O"]
# 1-2. 빙고 체크 함수 정의
def check_bingo() :
# 1-2-1. 가로 빙고 체크
bingo = {"X" : 0, "O" : 0}
for row in board :
if len(line := list(set(row))) == 1 and line[0] != "." : bingo[line[0]] += 1
# 1-2-2. 세로 빙고 체크
for col in zip(*board) :
if len(line := list(set(list(col)))) == 1 and line[0] != "." : bingo[line[0]] += 1
# 1-2-3. 대각선 빙고 체크
if len(line := list(set([board[0][0], board[1][1], board[2][2]]))) == 1 and line[0] != "." : bingo[line[0]] += 1
if len(line := list(set([board[0][2], board[1][1], board[2][0]]))) == 1 and line[0] != "." : bingo[line[0]] += 1
# 1-2-4. 말 별 빙고 수 반환
return bingo["X"], bingo["O"]
# 1-3. 게임판 생성
board = [list(board[:3]), list(board[3:6]), list(board[6:])]
# 1-4. 말 수 반환
piece_x, piece_o = check_piece()
# 1-5. 말 별 빙고 수 반환
bingo_x, bingo_o = check_bingo()
# 1-6. 빙고가 없으면서 게임판이 가득찬 경우 valid 반환
if not bingo_x and not bingo_o :
if piece_x == 5 and piece_o == 4 : return "valid"
# 1-7. X만 빙고인 경우
elif bingo_x <= 2 and not bingo_o :
# 1-7-1. X 말의 수가 O 말의 수보다 1개 더 많은 경우 valid 반환
if piece_x - 1 == piece_o : return "valid"
# 1-8. O만 빙고인 경우
elif not bingo_x and bingo_o == 1 :
# 1-8-1. X 말의 수와 O 말의 수가 같을 경우 valid 반환
if piece_x == piece_o : return "valid"
# 1-9. 이외의 경우 invalid 반환
return "invalid"
# 2.
while (board := input().strip()) != "end" :
# 2-1. 게임 유효성 검사 실행
print(game_validation(board))
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 2468. 안전 영역 (0) | 2024.08.12 |
---|---|
[Python/BOJ] 2688. 줄어들지 않아 (0) | 2024.07.29 |
[Python/BOJ] 1522. 문자열 교환 (0) | 2024.07.15 |
[Python/BOJ] 2668. 숫자고르기 (0) | 2024.07.11 |
[Python/BOJ] 2294. 동전 2 (0) | 2024.07.11 |