Study/BOJ

[BOJ] 14503. 로봇 청소기

MuviSsum 2021. 5. 26. 17:16

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

문제: 로봇 청소기가 청소하는 칸의 개수를 출력하라.

 

문제 이해하기!!

전형적인 구현 문제입니다.

문제에 주어진대로 따라하면 코드를 작성하면 풀 수 있는데,

다만 얼마나 효율적으로 짜냐, 어떤 방식으로 짜냐가 중요하죠!!

저는 밑의 방식으로 풀게 되었습니다.

 

그 방식을 설명하자면!!

1. 각 방향으로 한 칸 전진하는 것을 함수로 만들어 줍니다.

2. 주어진 행동을 계속 반복하기 위해 while True로 반복문을 돌려줍니다.

3. 방향을 정할 때, 계속 왼쪽으로 돌기 때문에 (d-1)%4를 해주면 딱 왼쪽방향이 된다. (중요!!)

4. 4번돌아도 청소할 곳이 없다면 2-3, 2-4번으로 넘어가게 한다.

5. 청소하면서 res 값을 +1 해주고 출력하면 끝!

끝~~!!

 

코드:

from sys import stdin
input = stdin.readline

# 입력
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for i in range(n)]
visit = [[False] * m for i in range(n)]


# 방향 한칸 전진
def direction(x, y, d):
    # 북쪽
    if d == 0:
        return (x - 1, y)
    # 동쪽
    elif d == 1:
        return (x, y + 1)
    # 남쪽
    elif d == 2:
        return (x + 1, y)
    # 서쪽
    return (x, y - 1)


# 탐색
res = 1
visit[r][c] = True
while True:
    for i in range(4):
        d = (d - 1) % 4
        rr, rc = direction(r, c, d)
        if board[rr][rc] == 1 or visit[rr][rc]:
            continue
        r, c = rr, rc
        visit[rr][rc] = True
        res += 1
        break
    else:
        r, c = direction(r, c, (d - 2) % 4)
        if board[r][c] == 1:
            break
print(res)
반응형