🐸 문제 정보
🤖 알고리즘
구현
⏱️ 풀이 시간
47.05m
📝 풀이
완전 대기업 코테에서 나올 것 같은 문자열 + 빡구현 문제였다...! 좋은 문제인둣...!
조건을 나눠서 그에 맞게 구현하면 되는 문제이다.
- 각 판에서 x는 5개, o는 4개가 최대이며, 이보다 더 많이 있다면 무조건 invalid
- x가 먼저 시작하기 때문에, x가 o보다 1개 많거나 같아야한다.
- x가 o와 같은 개수라면, o가 이기는 경우로 끝나야 유효하다.
- x가 o보다 1개 더 많다면, x가 이기는 경우로 끝나거나 비겼지만 가득 찬 경우로 끝나야 유효하다.
- 이 과정에서 이기는 경우란, 아래와 같다.
- 이겨야하는 문자가 한 행을 가득 채운다
- 이겨야하는 문자가 한 열을 가득 채운다
- 이겨야하는 문자가 한 대각선을 가득 채운다
대각선 검사하기... 빡셌다.
🧑💻 나의 답
# pypy3
import sys
input = sys.stdin.readline
def is_finish(winner):
key = winner + winner + winner
if key in [''.join(row) for row in board]: # 행 검사
return True
if key in [''.join([row[i] for row in board]) for i in range(3)]: # 열 검사
return True
if key in [''.join([board[i][i] for i in range(3)]), ''.join([board[j][abs(j - 2)] for j in range(3)])]: # 대각선 검사
return True
return False
def is_valid(x, o):
if (x > 5) or (o > 4):
print('invalid')
return
valid = False
of, xf = is_finish('O'), is_finish('X')
if x == o: # O가 이겨야함
if of and (not xf):
valid = True
elif (x - 1) == o: # X가 이기거나 / 둘다 못이겼지만 가득차야함
if xf and (not of):
valid = True
elif (not of) and (not xf):
if not any('.' in row for row in board):
valid = True
if valid:
print('valid')
else:
print('invalid')
while True:
board = input().rstrip()
if board == 'end': break
x, o = board.count('X'), board.count('O')
board = [list(board[i:i+3]) for i in range(0, 7, 3)]
is_valid(x, o)
'PS > 문제풀이' 카테고리의 다른 글
백준 2146 다리 만들기 Python (0) | 2024.02.02 |
---|---|
백준 1863 스카이라인 쉬운거 Python (0) | 2024.02.02 |
백준 17615 볼 모으기 Python (0) | 2024.02.02 |
백준 4659 비밀번호 발음하기 Python (0) | 2024.02.02 |
백준 1806 부분합 Python (2) | 2024.01.28 |