Algorithem/백준 PS with code
(python) 백준 #7682 - [G5] 틱택토 : 구현
jamong5
2023. 8. 22. 17:53
7682번: 틱택토
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 줄은 9개의 문자를 포함하며, 'X', 'O', '.' 중 하나이다. '.'은 빈칸을 의미하며, 9개의 문자는 게임판에서 제일 윗 줄 왼쪽부터의 순서이다. 입
www.acmicpc.net
불가능한 상황들을 나열하고 if문으로 하나씩 제거하기
특별히 다른 방법은 없는 것 같습니다. 꼼꼼하게 처리해주면 통과가 가능합니다.
이번엔 짜잘짜잘한 오타들이 많이 생기면서 디버깅에 시간이 좀 걸렸네요.
테스트 케이스를 여러가지 만들어서 시도해봐야했습니다.
코드
'''
Title : 틱택토
Link : https://www.acmicpc.net/problem/7682
Level : G5
Problem : 주어진 판이 가능한 틱택토 최종 상태인지 구하기
X가 먼저 놓는다.
Type : 구현
DATE : 23.08.22
'''
import sys
def solution(input) :
# O나 X 둘중 하나만 빙고여야한다. v
# O와 X 개수는 같거나 X가 하나 많아야한다. v
# 빙고가 없는 경우 꽉차있어야한다. v
# X가 빙고인 경우 X가 한개 더 많아야 한다. v
# O가 빙고인 경우 X와 O의 개수가 같아야한다. v
# 빙고가 2개 이상 있는 경우 모든 빙고에 겹치는 칸이 하나 있어야한다. v
def find_bingo(board) :
bingo_O = []
bingo_X = []
# 가로줄 보드 빙고 확인
for t in range(3) :
i = t*3
if board[i] == board[i+1] == board[i+2] :
if board[i] == 'O' :
bingo_O.append((i,i+1,i+2))
elif board[i] == 'X' :
bingo_X.append((i,i+1,i+2))
# 세로줄 보드 빙고 확인
for t in range(3) :
if board[t] == board[t+3] == board[t+6] :
if board[t] == 'O' :
bingo_O.append((t,t+3,t+6))
elif board[t] == 'X' :
bingo_X.append((t,t+3,t+6))
# 대각선 보드 빙고 확인
if board[0] == board[4] == board[8] :
if board[0] == 'O' :
bingo_O.append((0,4,8))
elif board[0] == 'X' :
bingo_X.append((0,4,8))
if board[2] == board[4] == board[6] :
if board[2] == 'O' :
bingo_O.append((2,4,6))
elif board[2] == 'X' :
bingo_X.append((2,4,6))
return bingo_O, bingo_X
while(True) :
board = input().rstrip()
if board == 'end' : break
cntO = board.count('O')
cntX = board.count('X')
cntdot = board.count('.')
# O, X 개수 조건
if not (cntO==cntX or cntO+1==cntX) :
print('invalid')
continue
bingo_O, bingo_X = find_bingo(board)
# OX 둘다 빙고가 있는 경우
if len(bingo_O) and len(bingo_X) :
print('invalid')
continue
# OX 둘다 빙고가 없는 경우
if not len(bingo_O) and not len(bingo_X) :
if cntdot :
print('invalid')
continue
if len(bingo_X) and cntX != cntO+1 :
print('invalid')
continue
if len(bingo_O) and cntX != cntO :
print('invalid')
continue
if len(bingo_X) >= 2 :
for i in bingo_X[0] :
flag = True
for k in bingo_X[1:] :
if i not in k :
flag = False
break
if flag :
break
else :
continue
if not flag :
print('invalid')
continue
print('valid')
input = sys.stdin.readline
solution(input)
my solved.ac :
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac