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
'Programming > python' 카테고리의 다른 글
백준 2293 : 동전 1 [파이썬] (0) | 2023.02.13 |
---|---|
백준 2629 : 양팔저울[파이썬] (0) | 2023.02.13 |
백준 1520 : 내리막 길 [파이썬] (0) | 2023.02.08 |
백준 12015 : 가장 긴 증가하는 부분수열 2 [파이썬] (0) | 2023.02.07 |
백준 2110 : 공유기 설치 [파이썬] (0) | 2023.02.07 |