상세 컨텐츠

본문 제목

[백준14503번]로봇청소기(파이썬)

알고리즘 공부

by Tabris4547 2022. 2. 21. 23:44

본문

728x90

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

문제가 상당히 길었습니다.

읽자마자 이게 뭔소리인가 싶게 만드는 문제.

우선, 회전한다라는 것에서 난감해지고

2-c의 조건, 바로 뒤로 간다?

여기서 상당히 난감해질 수 있습니다.

여기서 중요한 건

회전을 어떻게 구할 것이냐입니다.

먼저, 가장 중요한 회전 개념.

각 d의 값마다

동서남북을 매길 때의 경우입니다.

그 후, 뒤로가는 경우를 생각해봅니다.

각각의 케이스를 종합해보면

뒤로 가는 케이스는

(d-2)%4임을 유추할 수 있습니다.

북 서 남 동 순으로 회전하니

뒤로가는 게 2번 뒤라는 것도 알 수 있죠.

 

# 14503 로봇청소기
from sys import stdin

input = stdin.readline

N, M = map(int, input().split())

r, c, d = map(int, input().split())

r_d = [-1, 0, 1, 0]
c_d = [0, 1, 0, -1]
# 방향설정 북 동 남 서
room = [list(map(int, input().split())) for _ in range(N)]
clean = [[False] * M for _ in range(N)]
now_r = r
now_c = c

ans = 0
clean[now_r][now_c] = True
ans += 1

while True:
    change = 0
    while change < 4:
        rotate = (d - 1) % 4  # 회전방향
        r_r = now_r + r_d[rotate]
        r_c = now_c + c_d[rotate]
        if room[r_r][r_c] == 0 and clean[r_r][r_c] == False:
            d = rotate
            now_r = r_r
            now_c = r_c
            clean[now_r][now_c] = True
            ans += 1
            break
        else:
            d = rotate
            change += 1

    if change == 4:
        back_p = (d - 2) % 4  # 뒤로 가는 방향 만들어줌
        back_r = now_r + r_d[back_p]
        back_c = now_c + c_d[back_p]
        if room[back_r][back_c] == 0:
            now_r = back_r
            now_c = back_c
        else:
            break

print(ans)

 

 

제가 푼 파이썬 코드입니다.

저는 자꾸 숫자가 안 맞길래 찾아보니

동 서 남 북 값이 서로 엇갈린 게 있었더군요.

이런 사소한 거, 찾기 힘든 부분이니

처음부터 꼼꼼히 프로그래밍 하면 좋을거같습니다^^

728x90

관련글 더보기

댓글 영역