[SWEA] 11545. 틱택톰(Python)

냐항·2021년 12월 23일
0

🍋아직 구현 짬이 부족한가보다

요즘 구현 문제를 자주 풀게 되었다.
그럴 때마다 느낀느 것은 시키는 대로 하는 것도 쉽지 않구나,,
== 아직 양치기가 많이 부족하구나,,
저번에 풀었던 미생물 격리도 단순 구현이지만 매우 오래걸렸다.
다시 풀어봐야징

이번 문제도 구현 문제이며, 처음에는 순수하게 2차원 배열에 들어 있는 요소들을 한땀 한땀 검사했다. 하쥐만 1000개 중에 853개가 틀렸으며 아무리 봐도 맞왜틀이었다. 고래서 다른 방법으로 풀기로 결정!

고것은 행, 열, 대각선의 요소들을 문자열로 받아 검사하는 것!
그럼 10개의 문자열만 검사하면 된다!
앞으로 요론 문제는 노가다가 아닌 문자열로 풀어야겠다!!

처음에 틀린 답
1000개 중 853개 맞음
for tc in range(1, int(input())+1):

    if tc == 1:
        arr = [list(input().strip()) for _ in range(4)]
    else:
        arr = [list(input().strip()) for _ in range(5)]
        arr.pop(0)

    winner = 'Draw'
    for i in range(4):
        if winner != 'Draw':
            break
        row_x, row_o, row_t = 0, 0, 0
        col_x, col_o, col_t = 0, 0, 0
        for j in range(4):
            now_r = arr[i][j]
            now_c = arr[j][i]
            if now_r == 'X': row_x += 1
            elif now_r == 'O': row_o += 1
            elif now_r == 'T': row_t += 1

            if now_c == 'X': col_x += 1
            elif now_c == 'O': col_o += 1
            elif now_c == 'T': col_t += 1
        if (row_t==1 and row_x==3)  or row_x == 4:
            winner = 'X won'
            break
        elif (row_t==1 and row_o==3) or row_o == 4:
            winner = 'O won'
            break

    left_x, left_o, left_t = 0, 0, 0
    right_x, right_o, right_t = 0, 0, 0
    if winner == 'Draw':
        for i in range(4):
            if winner != 'Draw':
                break
            for j in range(4):
                tmp = arr[i][j]
                if i == j:
                    if tmp == 'X': left_x += 1
                    elif tmp == 'O': left_o += 1
                    elif tmp == 'T': left_t += 1
                elif i + j == 3:
                    if tmp == 'X': right_x += 1
                    elif tmp == 'O': right_o += 1
                    elif tmp == 'T': right_t += 1
            if (left_t == 1 and left_x == 3) or left_x == 4 or right_x == 4 or (right_t==1 and right_x==3):
                winner = 'X won'
                break
            elif (left_t==1 and left_o==3) or left_o==4 or right_o==4 or (right_t==1 and right_o==3):
                winner = 'O won'
                break


    if winner == 'Draw':
        flag = 0
        for i in range(4):
            for j in range(4):
                if arr[i][j] == '.':
                    winner = 'Game has not completed'
                    flag = 1
                    break
            if flag == 1:
                break

    print('#{} {}'.format(tc, winner))
## 이것은 맞은 답

### 행, 열, 대각선 총 10줄을 문자열로 변경하여 각 요소를 count

## o, x, t를 카운트해주는 함수
def check(word):
    cnt_x, cnt_o, cnt_t = 0, 0, 0
    for j in word:
        if j == 'X': cnt_x += 1
        elif j == 'O': cnt_o += 1
        elif j == 'T': cnt_t += 1
    if (cnt_t==1 and cnt_x==3) or cnt_x==4:
        return 'X won'
    elif (cnt_t==1 and cnt_o==3) or cnt_o==4:
        return 'O won'
    return 'Draw'


for tc in range(1, int(input())+1):
    ## 인풋 받을 때 주의!! 공백이 한 줄씩 있음
    if tc == 1:
        arr = [list(input().strip()) for _ in range(4)]
    else:
        arr = [list(input().strip()) for _ in range(5)]
        arr.pop(0)

    board = []                  ## 여기다가 문자열 담아줌
    winner = ''
    for i in range(4):
        tmp_r = ''
        tmp_c = ''
        for j in range(4):
            tmp_r += arr[i][j]  ## 행
            tmp_c += arr[j][i]  ## 열
        board.append(tmp_r)
        board.append(tmp_c)
    board.append(''.join([arr[0][0], arr[1][1], arr[2][2], arr[3][3]])) # 왼쪽 대각선
    board.append(''.join([arr[0][3], arr[1][2], arr[2][1], arr[3][0]])) # 오른쪽 대각선

    for i in range(10):                 ## 총 10줄을 검사해줌
        winner = check(board[i])
        if winner != 'Draw':            ## 승자가 있으면 break
            break

    if winner == 'Draw':                ## 승자가 없을 때
        flag = 0
        for i in range(4):
            for j in range(4):
                if arr[i][j] == '.':    ## 게임이 끝나지 않았을 때
                    winner = 'Game has not completed'
                    flag = 1
                    break
            if flag == 1:
                break
    print('#{} {}'.format(tc, winner))

0개의 댓글