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 |