[Python] BOJ 14503 - 로봇 청소기

728x90
반응형

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

# 2017년도 삼성SW역량 테스트 상반기 문제이다.

# 골드치곤 그냥 하라는 대로 짰더니 바로 맞춰서 쉬운 문제였다.

# 방향 4가지 경우를 나누어주고 2-a, 2-b, 2-c, 2-d경우를 다 나눠서 코드를 짰다.

 

# 한 가지 고려해야할 요소는 2-d에서 뒤쪽 방향이 '벽인 경우'에만 작동을 멈춰야 한다.

   뒤쪽 방향이 청소는 되어있지만, 벽이 아닌 경우 후진은 할 수 있기 때문이다.

   따라서 처음에 벽인 곳은 1로 표시하고, 청소한 곳은 2로 표시했다.

 

import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int,input().split())
r, c, d = map(int,input().split())
m = [list(map(int,input().split())) for _ in range(N)]
dx, dy = [0,0,-1,1], [1,-1,0,0]
cnt = 0
q = deque()
q.append((r, c, d))
while q:
	# 1번. 현재 위치 청소
	x, y, d = q.popleft()
	if m[x][y] == 0:
		m[x][y] = 2
		cnt += 1
	
	## 2번
	tmp = 0
	# 네 방향 청소가 이미 되어있거나 벽인 경우 tmp 1증가
	for i in range(4):
		nx, ny = x + dx[i], y + dy[i]
		if m[nx][ny] == 1 or m[nx][ny] == 2:
			tmp += 1
	if tmp == 4:
		if d == 0:
			# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
			if m[x+1][y] == 1:
				print(cnt)
				break
			# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
			else:
				q.append((x+1, y, d))
		elif d == 1:
			# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
			if m[x][y-1] == 1:
				print(cnt)
				break
			# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
			else:
				q.append((x, y-1, d))
		elif d == 2:
			# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
			if m[x-1][y] == 1:
				print(cnt)
				break
			# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
			else:
				q.append((x-1, y, d))
		elif d == 3:
			# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
			if m[x][y+1] == 1:
				print(cnt)
				break
			# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
			else:
				q.append((x, y+1, d))

	# 네 방향 중 청소해야할 구역이 존재하는 경우(2-a, 2-b)
	else:
		if d == 0:
			# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
			if m[x][y-1] == 0:
				q.append((x, y-1, 3))
			# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
			else:
				q.append((x, y, 3))
		elif d == 1:
			# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
			if m[x-1][y] == 0:
				q.append((x-1, y, 0))
			# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
			else:
				q.append((x, y, 0))
		elif d == 2:
			# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
			if m[x][y+1] == 0:
				q.append((x, y+1, 1))
			# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
			else:
				q.append((x, y, 1))
		elif d == 3:
			# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
			if m[x+1][y] == 0:
				q.append((x+1, y, 2))
			# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
			else:
				q.append((x, y, 2))

(solved.ac 티어: 골드 5)

728x90
반응형
TAGS.

Comments