728x90
삼성 SW 역량 테스트 기출 문제인 14503번 문제
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음
www.acmicpc.net
문제를 그대로 코드로 구현하면 되는 직관적인 문제였다.
def clean(now_row, now_col, direction):
if li[now_row][now_col] == 0:
li[now_row][now_col] = 2 #2는 청소된 부분을 말한다
if li[now_row][now_col - 1] != 0 and li[now_row - 1][now_col] != 0 and li[now_row][now_col + 1] != 0 and li[now_row + 1][now_col] != 0:
if direction == 0 and li[now_row + 1][now_col] != 1:
clean(now_row + 1, now_col, direction)
elif direction == 1 and li[now_row][now_col - 1] != 1:
clean(now_row, now_col - 1, direction)
elif direction == 2 and li[now_row - 1][now_col] != 1:
clean(now_row - 1, now_col, direction)
elif direction == 3 and li[now_row][now_col + 1] != 1:
clean(now_row, now_col + 1, direction)
else:
return
elif direction == 0:
if li[now_row][now_col - 1] == 0:
clean(now_row, now_col - 1, 3)
else:
clean(now_row, now_col, 3)
elif direction == 1:
if li[now_row - 1][now_col] == 0:
clean(now_row - 1, now_col, 0)
else:
clean(now_row, now_col, 0)
elif direction == 2:
if li[now_row][now_col + 1] == 0:
clean(now_row, now_col + 1, 1)
else:
clean(now_row, now_col, 1)
elif direction == 3:
if li[now_row + 1][now_col] == 0:
clean(now_row + 1, now_col, 2)
else:
clean(now_row, now_col, 2)
from sys import stdin
n, m = list(map(int, stdin.readline().split()))
r, c, d = list(map(int, stdin.readline().split()))
li = []
visited = [[False] * m for i in range(n)]
for i in range(n):
li.append(list(map(int, stdin.readline().split())))
clean(r, c, d)
count = 0
for i in range(n):
for j in range(m):
if li[i][j] == 2:
count += 1
print(count)
728x90
'알고리즘 문제' 카테고리의 다른 글
[백준] 1932번 정수 삼각형 (0) | 2020.01.18 |
---|---|
[백준] 14890번 경사로 (0) | 2020.01.16 |
[백준] 1149번 RGB 거리 (0) | 2020.01.12 |
[백준] 9461번 파도반수열 (0) | 2020.01.12 |
[백준] 11729번 하노이 탑 이동 순서 (0) | 2020.01.12 |