14503 로봇청소기 파이톤

n, m, y, x가 헷갈리는 경우가 많기 때문에 조심해야 할 것 같아요…

import sys

sys.setrecursionlimit(10 ** 4)
n, m = map(int, sys.stdin.readline().strip().split())
y, x, d = map(int, sys.stdin.readline().strip().split())
graphs = (list(map(int, sys.stdin.readline().strip().split())) for _ in range(n))

answer = 0
dx, dy = (0 ,1 ,0, -1), (-1, 0, 1, 0)
# 북 동 남 서
def check():
    global x, y, dx, dy, d, graphs, n, m
    for direction in range(4):
        nx = x + dx(direction)
        ny = y + dy(direction)
        if nx >= m or nx < 0 or ny >= n or ny < 0:
            continue
        if graphs(ny)(nx) == 1:
            continue
        if graphs(ny)(nx) == 0:
            return False
    return True

def move():
    global x, y, graphs, d, dx, dy
    x = x + dx(d)
    y = y + dy(d)

def current_place_clear():
    global x, y, graphs, answer
    graphs(y)(x) = "clear"
    answer += 1
    return

def move_back():
    global x, y, dx, dy, d
    x =  x + dx((d + 2) % 4)
    y = y + dy((d + 2) % 4)
    return

def back_check(): #뒤 확인 후 갈 곳이 벽이면 종료.
    global d, dx, dy, graphs
    nx = x + dx((d + 2) % 4)
    ny = y + dy((d + 2) % 4)
    if nx >= m or nx < 0 or ny >= n or ny < 0:
        return False
    if graphs(ny)(nx) == 1:
        return True
    return False

def trans90():
    global d
    d = (d + 3) % 4

def check_front():
    global d, dx, dy, graphs
    nx = x + dx(d)
    ny = y + dy(d)
    if nx >= m or nx < 0 or ny >= n or ny < 0:
        return False
    if graphs(ny)(nx) == 1:
        return False
    if graphs(ny)(nx) == "clear":
        return False
    return True


while True:
    if graphs(y)(x) == 0:
        current_place_clear()
    if check():
        if back_check():
            break
        else:
            move_back()
            continue
    else:
        while True:
            trans90()
            if check_front():
                break
        move()

print(answer)