소스 코드

T = int(input())
# 출력값 저장
res_list = ['O won', 'X won', 'Draw', 'Game has not completed']
# 출력에 필요한 index 값 저장
my_items = []
for tc in range(T):
# 주어진 input이 T-1이 전에는 5줄임
if tc < T - 1:
board = [list(input()) for _ in range(5)]
else:
board = [list(input()) for _ in range(4)]
# '.'이 없으면 0 있으면 1
check = 0
# 이긴 사람이 있으면 1 없으면 0
res = 0
# 행,열 확인
for q in range(4):
temp_row = 0
temp_col = 0
cnt_row = 0
cnt_col = 0
for w in range(4):
# 행의 값이 변하지 않았으면
if temp_row == 0:
# 해당 index의 값이 X 나 O이면 cnt + 1 해주고, temp에 저장
if board[q][w] == 'X' or board[q][w] == 'O':
cnt_row += 1
temp_row = board[q][w]
# '.'이면 check 바꾸기
elif board[q][w] == '.':
check = 1
# T이면 cnt + 1 만
else:
cnt_row += 1
# 행의 값에 X or O가 저장된 상태면
else:
# 현재 index의 값이 temp에 저장된 값이랑 같거나 T이면
if (board[q][w] == temp_row) or board[q][w] == 'T':
cnt_row += 1
elif board[q][w] == '.':
check = 1
if temp_col == 0:
if board[w][q] == 'X' or board[w][q] == 'O':
cnt_col += 1
temp_col = board[w][q]
elif board[w][q] == '.':
check = 1
else:
cnt_col += 1
else:
if (board[w][q] == temp_col) or board[w][q] == 'T':
cnt_col += 1
elif board[w][q] == '.':
check = 1
# cnt가 4인 경우, 저장된 값에 따라 my_items에 저장
if cnt_row == 4:
if temp_row == 'O':
my_items.append(0)
else:
my_items.append(1)
# res값 변경
res = 1
break
if cnt_col == 4:
if temp_col == 'O':
my_items.append(0)
else:
my_items.append(1)
res = 1
break
# 대각선 확인
if res == 0:
temp_cross1 = 0
temp_cross2 = 0
cnt_cross1 = 0
cnt_cross2 = 0
for qq in range(4):
if temp_cross1 == 0:
if board[qq][qq] == 'O' or board[qq][qq] == 'X':
cnt_cross1 += 1
temp_cross1 = board[qq][qq]
elif board[qq][qq] == 'T':
cnt_cross1 += 1
else:
if (board[qq][qq] == temp_cross1) or board[qq][qq] == 'T':
cnt_cross1 += 1
if temp_cross2 == 0:
if board[qq][3 - qq] == 'O' or board[qq][3 - qq] == 'X':
cnt_cross2 += 1
temp_cross2 = board[qq][3 - qq]
elif board[qq][3 - qq] == 'T':
cnt_cross2 += 1
else:
if (board[qq][3 - qq] == temp_cross2) or board[qq][3 - qq] == 'T':
cnt_cross2 += 1
if cnt_cross1 == 4:
if temp_cross1 == 'O':
my_items.append(0)
else:
my_items.append(1)
res = 1
if cnt_cross2 == 4:
if temp_cross2 == 'O':
my_items.append(0)
else:
my_items.append(1)
res = 1
if res == 0:
# '.'이 없었으면
if check == 0:
# Draw
my_items.append(2)
else:
# 그 외
my_items.append(3)
idx = 1
for r in my_items:
print('#{} {}'.format(idx, res_list[r]))
idx += 1

 


해결 방법

1. 행 4개 열 4개 대각선 2개 케이스마다 총 10개만 확인할 수 있는 코드를 짜면 된다

 

2. 최대한 연산을 줄이기 위해 res값을 저장해서 불필요한 연산을 방지함


느낀 점

1. 속도도 좋지만 코드를 단순하게 짤 수 있는 아이디어도 중요하다

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.