아이공의 AI 공부 도전기

[Baekjoon] 14503번 : 로봇 청소기 (Python, 구현)

 

     

 

 

 

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

코드 링크

https://github.com/stellaluminary/Baekjoon

 

GitHub - stellaluminary/Baekjoon

Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.

github.com

 

Python

 

방법 1 - 메모리 30988KB / 시간 68ms / 코드 길이 646B

 

우선 방향 설정부터 하겠다

입력 조건으로  "d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다."라고 명시되어 있고 로봇청소기는 왼쪽 방향으로 움직인다고 설정되어 있다.

이에 dir = [(-1,0), (0,1), (1,0), (0,-1)]로 각 index별 위치 이동 방향을 설정해놓고 왼쪽으로 움직이는 것은 현재 방향 (d + 3) %4로 설정한 뒤 차후의 이동을 위한 index로 사용한다. (초기 입력 내용을 망각하다가 많은 시간을 보냈으므로 꼭 기억)

 

이후 방문하지 않았다면 2로 설정하여 1(벽)과 구분한다.

 

만약 4방향으로 돌아도 발견하지 못했다면 뒤에 해당하는 방향 (d + 2) %4을 기준으로 미래 뒷 방향으로 이동한다.

단, 여기서도 주의해야할 점은 뒤로 이동하고자 할 때 방향은 뒷 방향이 아닌 원래 방향으로 진행해야 한다는 점이다.

가령 내가 방향 0(북쪽), x,y=3,3에서 모든 방향이 2(이미 청소한 곳)라고 가정하자.

이때 나는 뒷 방향 0+2 = 2(남쪽)을 향하도록 한 뒤 nx, ny = 3+1=4, 3+0=3으로 정하고 뒤로 이동한다. 그러나 이동하고 나서의 방향은 남쪽이 아닌 북쪽을 가르키고 있어야 한다.

 

만약 뒤 방향이 벽이라면 종료 

 

import sys
input = sys.stdin.readline

n,m = map(int, input().split())
r, c, d = map(int, input().split())
dir = [(-1,0), (0,1), (1,0), (0,-1)]
l = [list(map(int, input().split())) for _ in range(n)]
ans = 0

def robot(x, y, d):
    global ans
    if not l[x][y]:
        l[x][y] = 2
        ans += 1

    for _ in range(4):
        nd = (d + 3) % 4
        nx, ny = x + dir[nd][0], y + dir[nd][1]
        if not l[nx][ny]:
            robot(nx, ny, nd)
            return
        d = nd

    nd = (d + 2) % 4
    nx, ny = x + dir[nd][0], y + dir[nd][1]
    if l[nx][ny] == 1:
        print(ans)
        exit(0)
    robot(nx, ny, d)

robot(r,c,d)

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading