Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프로그래머스 #python #2021카카오 #카카오코테 #카카오인턴쉽
- 프로그래머스 #NULL 처리하기
- 백준 #백준알고리즘 #알고리즘 #코딩테스트 #코딩테스트준비 #코테준비 #백준2110 #python #문제풀이
- 백준 #백준2217 #백준로프 #python
- 카카오 코테
- 프로그래머스 #python #코딩테스트 #코테공부 #알고리즘 #dict
- 프로그래머스 #sql #mysql #코딩테스트
- 백준 #이거다시풀기
- 그리디알고리즘 #그리디 #백준 #우선순위큐 #최소힙 #최대힙 #알고리즘 #코딩테스트 #python
- 동
- 프로그래머스 #c++ #코딩테스트
- 카카오 #프로그래머스 #python #코딩테스트 #오픈채팅방
- 프로그래머스 #네트워크 #c++ #코딩테스트 #코테 #코테준비 #dfs
Archives
- Today
- Total
say repository
[백준] 14503 로봇 청소기 python 본문
728x90
문제
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 인접한 칸을 탐색한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
입력
첫째 줄에 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 50)
둘째 줄에 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 주어진다. d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다.
셋째 줄부터 N개의 줄에 장소의 상태가 북쪽부터 남쪽 순서대로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 빈 칸은 0, 벽은 1로 주어진다. 지도의 첫 행, 마지막 행, 첫 열, 마지막 열에 있는 모든 칸은 벽이다.
로봇 청소기가 있는 칸의 상태는 항상 빈 칸이다.
출력
로봇 청소기가 청소하는 칸의 개수를 출력한다.
코드
# 14503
import sys
from collections import deque
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
n, m = map(int,sys.stdin.readline().split())
r, c, d = map(int,sys.stdin.readline().split())
arr = []
for _ in range(n):
arr.append(list(map(int,sys.stdin.readline().split())))
def rotate_left(d): # 현재 바라보고있는 방향에서 왼쪽으로
return (d+3) % 4
def back(d): # 후진
return (d+2) % 4
def bfs(r,c,d):
q = deque()
q.append([r, c, d])
arr[r][c] = 2 # 청소
cnt = 1
while q:
qr, qc, qd = q.popleft()
tmp_qd = qd
for i in range(4):
tmp_qd = rotate_left(tmp_qd) # 현재 방향에서 왼쪽으로
nr = qr + dx[tmp_qd]
nc = qc + dy[tmp_qd]
# 왼쪽에 청소안한 방이 있다면
if 0<=nr<n and 0<=nc<m and arr[nr][nc] == 0:
# 아직 청소 안했으면 청소하고 방향바꾸기
arr[nr][nc] = 2
cnt += 1
q.append([nr,nc,tmp_qd])
break
# 갈 곳이 없다면
elif i==3:
# 방향 유지한채 한칸 후진
nr = qr + dx[back(qd)]
nc = qc + dy[back(qd)]
q.append([nr, nc, qd])
if arr[nr][nc] == 1: # 뒤에도 벽이 있다면 중단
return cnt
print(bfs(r,c,d))
풀이
bfs로 풀이했다.
dx, dy 방향 배열을 북, 동 , 남, 서 (0, 1, 2, 3) 으로 저장해둔다.
왼쪽으로 이동하는 함수와 후진하는 함수를 구현해뒀다.
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 11724 연결 요소의 개수 python (0) | 2022.03.26 |
---|---|
[백준] 15829 Hashing python (0) | 2022.03.25 |
[백준] 14891 톱니바퀴 python (0) | 2022.03.17 |
[백준] 11005 진법 변환 2 c++ (0) | 2022.03.15 |
[백준] 11041 플로이드 python (0) | 2022.03.14 |