소스 코드
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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] 창용 마을 무리의 개수 - PYTHON #7465 (0) | 2021.03.15 |
---|---|
[SWEA 코딩] 몬스터 사냥 - PYTHON #11387 (0) | 2021.03.14 |
[SWEA 코딩] 가장 빠른 문자열 타이핑 - PYTHON #3143 (0) | 2021.03.11 |
[SWEA 코딩] S/W 문제해결 기본 사칙연산 - PYTHON #1232 (0) | 2021.03.09 |
[SWEA 코딩] S/W 문제해결 기본 중위순회 - PYTHON #1231 (0) | 2021.03.05 |