-
14503 로봇 청소기코테 대비 python/백준 2023. 4. 11. 00:48
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
n,m = map(int,input().split()) r,c,d = map(int,input().split()) graph = [list(map(int,input().split())) for _ in range(n)] visited = [[0]*m for _ in range(n)] #처음 빈칸은 전부 청소되지 않은 상태이다. #순서대로 구현하자!! #청소하는칸 카운트 cnt=0 #방향 조건에 맞게 상우하좌 1씩 빼면 반시계 90도 0일때는 3으로 dx=[-1,0,1,0] dy=[0,1,0,-1] while 1: flag = 0 if visited[r][c]==0: visited[r][c]=1 cnt+=1 #현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우 for i in range(4): nx=r+dx[i] ny=c+dy[i] #범위 안에 있으며, 방문하지 않았고, 벽이 아니라 빈칸이면 if 0<=nx<n and 0<=ny<m and visited[nx][ny]==0 and graph[nx][ny]==0: #청소안한 빈칸 있는거 flag=1 #빈칸없어 뒤로 후진해야됨 if flag==0: if d==0: nx = r + dx[2] ny = c + dy[2] if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0: cnt+=1 visited[nx][ny] = 1 r,c=nx,ny elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0: r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: print(cnt) break elif d==1: nx = r + dx[3] ny = c + dy[3] if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0: cnt+=1 visited[nx][ny] = 1 r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0: r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: print(cnt) break elif d==2: nx = r + dx[0] ny = c + dy[0] if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0: cnt+=1 visited[nx][ny] = 1 r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0: r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: print(cnt) break elif d==3: nx = r + dx[1] ny = c + dy[1] if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0: cnt+=1 r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0: r, c = nx, ny elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: print(cnt) break elif flag==1: if d==0: #90도로 방향돌리기 d=3 else: #90도로 방향돌리기 d-=1 nx = r + dx[d] ny = c + dy[d] if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0: #방문표시 visited[nx][ny]=1 r, c = nx, ny cnt+=1
리펙토링이 필요하긴하다..
실전에서는?? 함수화하는게 관리가 편하려나
'코테 대비 python > 백준' 카테고리의 다른 글
복습 1935 후위 표기식2 (0) 2023.04.14 1181 단어 정렬 (0) 2023.04.11 1966 프린터 큐 (0) 2023.04.10 13335 트럭 (0) 2023.04.10 14888 연산자 끼워넣기 (0) 2023.04.04