본문 바로가기

카테고리 없음

Swea D3 오목판정 Python 4방향

알고리즘 사용된 코드 (4방향 탐색)

dy = [1,0,1,-1] # 아 오 대각, 역대각
dx = [0,1,1,1]
start_time = time.time()
def o_mok(y,x):
    # 4방향 탐색
    for bang in range(4):
        cnt = 1 # 기준 좌표에 돌이 있다 cnt = 1부터 시작
        # 돌 4개를 탐색
        for power in range(1, 5):
            ny = y + (dy[bang] * power)
            nx = x + (dx[bang] * power)
            if not (0 <= ny < n and 0 <= nx < n): break
            # 돌을 발견하면 count
            if arr[ny][nx] == 'o': cnt += 1
            if cnt == 5:  # 오목 발견
                return True
    return False
def game_start():
    for r in range(n):
        for c in range(n):
            if arr[r][c] == 'o':
                if o_mok(r,c):
                    return 'YES'
    return 'NO'

t = int(input())
for tc in range(1,t+1):
    n = int(input())
    arr = [input() for _ in range(n)]
    result = game_start()
    print(f'#{tc} {result}')

해결한 코드 1

def o_mok():
    flag = 0
    # 가로
    for i in range(n):
        for j in range(n):
            if j +4 > n: break
            if j + 4 < n and arr[i][j] == 'o' and arr[i][j + 1] == 'o' and arr[i][j + 2] == 'o' and arr[i][j + 3] == 'o' and arr[i][j + 4] == 'o':
                flag = 1
                return flag
    # 세로
    for i in range(n):
        for j in range(n):
            if i+4 > n: break
            if i + 4 < n:
                if arr[i][j] == 'o' and arr[i + 1][j] == 'o' and arr[i + 2][j] == 'o' and arr[i + 3][j] == 'o' and arr[i + 4][j] == 'o':
                    flag = 1
                    return flag
    # 역 대각선으로 보기
    for i in range(n):
        for j in range(n - 1, -1, -1):
            if i + 4 > n and j - 4 <= 0: break
            if i + 4 < n and j - 4 >= 0:
                if arr[i][j] == 'o' and arr[i + 1][j - 1] == 'o' and arr[i + 2][j - 2] == 'o' and arr[i + 3][j - 3] == 'o' and arr[i + 4][j - 4] == 'o':
                    flag = 1
                    return flag
    # 정 대각선
    for i in range(n):
        for j in range(n):
            if i + 4 > n and j + 4 > n: break
            if i + 4 < n and j + 4 < n:
                if arr[i][j] == 'o' and arr[i + 1][j + 1] == 'o' and arr[i + 2][j + 2] == 'o' and arr[i + 3][j + 3] == 'o' and arr[i + 4][j + 4] == 'o':
                    flag = 1
                    return flag
t = int(input())
for tc in range(1,t+1):
    n = int(input())
    arr = [list(input()) for _ in range(n)]
    stack = [0 for _ in range(4)] # 가로 세로 대각 역대각
    # print(f'#{tc}')
    # for x in arr:
    #     print(x)
    if o_mok():
        print(f'#{tc} YES')
    else:
        print(f'#{tc} NO')

    # print(stack)

해결한 코드 2

def o_mok():
    flag = 0
    # 가로
    for i in range(n):
        for j in range(n):
            if j + 4 < n:
                if arr[i][j] == 'o':
                    stack[0] += 1
                    if arr[i][j + 1] == 'o':
                        stack[0] += 1
                        if arr[i][j + 2] == 'o':
                            stack[0] += 1
                            if arr[i][j + 3] == 'o':
                                stack[0] += 1
                                if arr[i][j + 4] == 'o':
                                    stack[0] += 1
                                    flag = 1
                                    return flag
                                else:
                                    stack[0] -= 1
                            else:
                                stack[0] -= 1
                        else:
                            stack[0] -= 1
                    else:
                        stack[0] -= 1
    # 세로
    for i in range(n):
        for j in range(n):
            if i + 4 < n:
                if arr[i][j] == 'o':
                    stack[1] += 1
                    if arr[i + 1][j] == 'o':
                        stack[1] += 1
                        if arr[i + 2][j] == 'o':
                            stack[1] += 1
                            if arr[i + 3][j] == 'o':
                                stack[1] += 1
                                if arr[i + 4][j] == 'o':
                                    stack[1] += 1
                                    flag = 1
                                    return flag
                                else:
                                    stack[1] -= 1
                            else:
                                stack[1] -= 1
                        else:
                            stack[1] -= 1
                    else:
                        stack[1] -= 1
    # 역 대각선으로 보기
    for i in range(n):
        for j in range(n - 1, -1, -1):
            if i + 4 < n and j - 4 >= 0:
                if arr[i][j] == 'o':
                    stack[3] += 1
                    if arr[i + 1][j - 1] == 'o':
                        stack[3] += 1
                        if arr[i + 2][j - 2] == 'o':
                            stack[3] += 1
                            if arr[i + 3][j - 3] == 'o':
                                stack[3] += 1
                                if arr[i + 4][j - 4] == 'o':
                                    stack[3] += 1
                                    flag = 1
                                    return flag
                                else:
                                    stack[3] -= 1
                            else:
                                stack[3] -= 1
                        else:
                            stack[3] -= 1
                    else:
                        stack[3] -= 1
    # 정 대각선
    for i in range(n):
        for j in range(n):
            if i + 4 < n and j + 4 < n:
                if arr[i][j] == 'o':
                    stack[2] += 1
                    if arr[i + 1][j + 1] == 'o':
                        stack[2] += 1
                        if arr[i + 2][j + 2] == 'o':
                            stack[2] += 1
                            if arr[i + 3][j + 3] == 'o':
                                stack[2] += 1
                                if arr[i + 4][j + 4] == 'o':
                                    stack[2] += 1
                                    flag = 1
                                    return flag
                                else:
                                    stack[2] -= 1
                            else:
                                stack[2] -= 1
                        else:
                            stack[2] -= 1
                    else:
                        stack[2] -= 1
t = int(input())
for tc in range(1,t+1):
    n = int(input())
    arr = [list(input()) for _ in range(n)]
    stack = [0 for _ in range(4)] # 가로 세로 대각 역대각
    # print(f'#{tc}')
    # for x in arr:
    #     print(x)
    if o_mok():
        print(f'#{tc} YES')
    else:
        print(f'#{tc} NO')

틀린 코드 100개중 74개 맞음

t = int(input())
for tc in range(1,t+1):
    n = int(input())
    arr = [list(input()) for _ in range(n)]
    # stack = [[0] * n for _ in range(n)]
    stack = []
    # print(f'#{tc}')
    # for x in arr:
    #     print(x)
    # 가로
    for i in range(n):
        for j in range(n):
            if j + 4 < n:
                if arr[i][j] == 'o':
                    stack.append(1)
                    if arr[i][j + 1] == 'o':
                        stack.append(1)
                        if arr[i][j + 2] == 'o':
                            stack.append(1)
                            if arr[i][j + 3] == 'o':
                                stack.append(1)
                                if arr[i][j + 4] == 'o':
                                    stack.append(1)
                                else:
                                    stack.pop()
                            else:
                                stack.pop()
                        else:
                            stack.pop()
                    else:
                        stack.pop()
    # 세로
    for i in range(n):
        for j in range(n):
            if i + 4 < n:
                if arr[j][i] == 'o':
                    stack.append(1)
                    if arr[j][i + 1] == 'o':
                        stack.append(1)
                        if arr[j][i + 2] == 'o':
                            stack.append(1)
                            if arr[j][i + 3] == 'o':
                                stack.append(1)
                                if arr[j][i + 4] == 'o':
                                    stack.append(1)
                                else:
                                    stack.pop()
                            else:
                                stack.pop()
                        else:
                            stack.pop()
                    else:
                        stack.pop()
    # 역 대각선으로 보기
    for i in range(n):
        for j in range(n-1,-1,-1):
            if i+4 < n and j-4 >= 0:
                if arr[i][j] == 'o':
                    stack.append(1)
                    if arr[i+1][j-1] == 'o':
                        stack.append(1)
                        if arr[i + 2][j - 2] == 'o':
                            stack.append(1)
                            if arr[i + 3][j - 3] == 'o':
                                stack.append(1)
                                if arr[i + 4][j - 4] == 'o':
                                    stack.append(1)
                                else:
                                    stack.pop()
                            else:
                                stack.pop()
                        else:
                            stack.pop()
                    else:
                        stack.pop()
    # 정 대각선
    for i in range(n):
        for j in range(n):
            if i+4 < n and j+4 < n:
                if arr[i][j] == 'o':
                    stack.append(1)
                    if arr[i+1][j+1] == 'o':
                        stack.append(1)
                        if arr[i + 2][j + 2] == 'o':
                            stack.append(1)
                            if arr[i + 3][j + 3] == 'o':
                                stack.append(1)
                                if arr[i + 4][j + 4] == 'o':
                                    stack.append(1)
                                else:
                                    stack.pop()
                            else:
                                stack.pop()
                        else:
                            stack.pop()
                    else:
                        stack.pop()
    if stack.count(1) >= 5:
        print(f'#{tc} YES')
    else:
        print(f'#{tc} NO')