[BOJ 14503] 로봇 청소기(Python)

박현우·2021년 1월 26일
0

BOJ

목록 보기
18/87

문제

로봇 청소기

문제 해설

따로 문제를 푸는 방식은 없고, 주어진대로 문제를 해결하기만 하면 되기 때문에 구현 능력이 중요하다. 특히, 시뮬레이션 문제는 주어진 조건을 제대로 짚고 넘어가야 한다. 코드가 길어질 수 있기 때문에 변수의 이름을 처음부터 제대로 작성하는 습관을 길러야 겠다.

맵이 커지면 input으로 처리하는 속도가 늦어질 수 있어 sys.stdin.readline을 사용했다.

소스 코드

# 11:53
import sys

input = sys.stdin.readline
n, m = map(int, input().split())
r, c, d = map(int, input().split())
graph = []
visited = [[False] * m for _ in range(n)]
answer = 0
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 맵 다운로드
for _ in range(n):
    graph.append(list(map(int, input().split())))

# 현재 방향에서 왼쪽
def turn(d):
    if d - 1 < 0:
        return 3
    return d - 1


while True:
    flag = False
    # 뒤로 점프하는 경우도 있기 때문에 if문 작성
    if not visited[r][c]:
        answer += 1
        visited[r][c] = True
    for i in range(4):
        d = turn(d)
        nowx = r + dx[d]
        nowy = c + dy[d]
        # 방문하지 않았고 청소도 가능함
        if not visited[nowx][nowy] and graph[nowx][nowy] == 0:
            flag = True
            r = nowx
            c = nowy
            break
    # 네 방향 모두 청소가 되있거나 벽
    if not flag:
        # 바라본 방향 바로 뒤에 벽
        if graph[r - dx[d]][c - dy[d]] == 1:
            break
        # 뒤에 벽이 없음
        else:
            r -= dx[d]
            c -= dy[d]
print(answer)

0개의 댓글