Programming/python

백준 14503 : 로봇 청소기 [파이썬]

kevin_01 2023. 2. 9. 16:58
728x90

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

1. 문제 설명

  • 이 문제는 전형적인 시뮬레이션 문제이다.
  • 문제에서 요구하는 내용을 오류 없이 성실하게 구현한다면 풀기 가능
  • 사방 탐색을 위해 dr, dc 의 별도의 리스트를 만들어 방향 탐색을 통해 카운트를 세어 몇번 움직였는지 세면 된다.

 

2. 입, 출력

3. 코드

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
r, c, d = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]

dr = [-1,0,1,0]
dc = [0,1,0,-1]

visit = [[0]*m for _ in range(n)]
visit[r][c] = 1
cnt = 1

while True:
    flag = 1
    for _ in range(4):
        d = (d+3)%4
        nr = r + dr[d]
        nc = c + dc[d]

        if 0<=nr<n and 0<=nc<m and arr[nr][nc] == 0:
            if visit[nr][nc] == 0:
                visit[nr][nc] = 1
                r = nr
                c = nc
                cnt += 1
                flag = 0
                break

    if flag:
        if arr[r-dr[d]][c-dc[d]] == 1:
            print(cnt)
            break
        else:
            r = r-dr[d]
            c = c-dc[d]

방향은 북, 동, 남, 서(시계방향)으로 입력을 받지만 왼쪽으로 돌려서 진행 해야 하기 때문에 3씩 더해줘서 4로 나눈 나머지 값으로 왼쪽을 돌리는 것을 구현했다.

flag를 넣어 for문에서 flag가 바뀌지 않는다면 사방이 다 갔던 곳이거나 벽이기 때문에 뒤가 벽이 아니라면 뒤로 가고 아니라면 청소를 끝낸다.

돌리는 것이 헷갈려서 문제 고민하는 데 시간이 많이 들었다.

 

구현 문제는 말그대로 구현만 하면 되는 문제들이라 풀릴듯 말듯 한게 어려운 것 같다.

728x90