본문 바로가기

코딩테스트/파이썬

[백준] 14503번 로봇 청소기

728x90

문제 설명

 

 

함수의 인자로는 행의 좌표, 열의 좌표, 현재 방향을 넣어주고 해당 좌표의 값이 0일 경우 값을 2로 바꾸어 청소했다고 표시하고 count 값을 1 증가시켰다.

 

 

문제에서 주어진 대로 현재 방향의 왼쪽 칸이 청소되어 있는지 확인을 하고 청소가 되어있지 않으면 현재 방향에 따라 방향을 바꾼 후 한 칸 옮겼다.

 

 

만약 왼쪽 칸이 청소되어 있을 경우 현재 칸의 상,하,좌,우의 칸들이 청소되어 있는지 확인한다.

상,하,좌,우의 칸들이 모두 청소되어 있을 경우 현재 방향으로부터 뒷 칸이 벽인지 확인한 후 벽일 경우 함수를 종료하고 벽이 아닐 경우 현재 방향을 유지한 채 한 칸 후진한다.

 

 

상,하,좌,우의 칸들 중 한 칸이라도 청소되어 있지 않은 칸이 존재할 경우 현재 칸에서 방향만 왼쪽으로 바꿔준다.

 

 

각 칸들을 확인하는 함수들은 밑에 전체 코드에 있다.

 

전체 코드

board = []
N = 0
M = 0
count = 0
left_dir = [3,0,1,2]

def isBackWall(xpos,ypos,dir):
    if dir == 0:
        if board[xpos+1][ypos] == 1:
            return True
    elif dir == 1:
        if board[xpos][ypos-1] == 1:
            return True
    elif dir == 2:
        if board[xpos-1][ypos] == 1:
            return True
    elif dir == 3:
        if board[xpos][ypos+1] == 1:
            return True
    return False

def isAllCleaned(xpos,ypos):
    if board[xpos-1][ypos] == 0:
        return False
    if board[xpos+1][ypos] == 0:
        return False
    if board[xpos][ypos-1] == 0:
        return False
    if board[xpos][ypos+1] == 0:
        return False
    return True

def isLeftNotCleaned(xpos,ypos,dir):
    if dir == 0:
        if board[xpos][ypos-1] == 0:
            return True
    elif dir == 1:
        if board[xpos-1][ypos] == 0:
            return True
    elif dir == 2:
        if board[xpos][ypos+1] == 0:
            return True
    elif dir == 3:
        if board[xpos+1][ypos] == 0:
            return True
    return False

def func(xpos,ypos,dir):
    global N
    global M
    global count
    global board
    global left_dir

    if board[xpos][ypos] == 0:
        board[xpos][ypos] = 2
        count += 1

    if isLeftNotCleaned(xpos,ypos,dir):
        if dir == 0:
            func(xpos,ypos-1,3)
        elif dir == 1:
            func(xpos-1,ypos,0)
        elif dir == 2:
            func(xpos,ypos+1,1)
        elif dir == 3:
            func(xpos+1,ypos,2)
    else:
        if isAllCleaned(xpos,ypos):
            if isBackWall(xpos,ypos,dir):
                return
            else:
                if dir == 0:
                    func(xpos+1,ypos,dir)
                elif dir == 1:
                    func(xpos,ypos-1,dir)
                elif dir == 2:
                    func(xpos-1,ypos,dir)
                elif dir == 3:
                    func(xpos,ypos+1,dir)
        else:
            func(xpos,ypos,left_dir[dir])
    return


def main():
    global N
    global M
    global board
    global count
    N,M = map(int,input().split())
    r,c,dir = map(int,input().split())
    for i in range(N):
        board.append(list(map(int,input().split())))
    func(r,c,dir)
    print(count)
    return

if __name__ == "__main__":
    main()
728x90
반응형

'코딩테스트 > 파이썬' 카테고리의 다른 글

백준 12891번 톱니바퀴  (0) 2021.02.11
백준 3190번 뱀  (0) 2021.02.11
백준 11559번 Puyo Puyo  (0) 2021.02.09
백준 18808번 스티커 붙이기  (0) 2021.02.09
백준 12100번 2048(Easy)  (0) 2021.02.07