삼성 SW 역량 테스트 기출 문제
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음
www.acmicpc.net


Solution
from collections import deque | |
#북동남서 | |
dx = [0, 1, 0, -1] | |
dy = [-1, 0, 1, 0] | |
def result(maps): | |
result = 0 | |
for i in range(n): | |
for j in range(m): | |
if maps[i][j] == -1: | |
result += 1 | |
return result | |
def robotCleaner(y, x, d, cnt): | |
while True: | |
if cnt == 4: | |
backX = x + dx[(d+2)%4] | |
backY = y + dy[(d+2)%4] | |
# 2.c | |
if maps[backY][backX] == -1: | |
y, x, d, cnt = backY, backX, d, 0 | |
# 2.d | |
else: | |
return result(maps) | |
# 1. | |
if maps[y][x] == 0: | |
maps[y][x] = -1 | |
# 2. | |
td = turn(d) | |
turnX = x + dx[td] | |
turnY = y + dy[td] | |
# 2.a | |
if maps[turnY][turnX] == 0: | |
y, x, d, cnt = turnY, turnX, td, 0 | |
# 2.b | |
else: | |
y, x, d, cnt = y, x, td, cnt+1 | |
def turn(d): | |
if d == 0: | |
return 3 | |
else: | |
return d-1 | |
n, m = map(int, input().split(' ')) | |
r, c, d = map(int, input().split(' ')) | |
maps = [list(map(int, input().split(' '))) for _ in range(n)] | |
print(robotCleaner(r, c, d, 0)) |
문제 유형 : 시뮬레이션
구현해야 할 것
- 로봇청소기의 방향을 보고있는 방향의 왼쪽으로 회전
- 네 방향 다 막혀있을 때 한 칸 후진
사실 문제에서 주어진 로직들을 그대로 구현하면 되는 문제였다. 말은 쉽지만 나도 동서남북 방향 설정하는 것에 익숙치 않았기 때문에 쉽지만은 않았다. dx와 dy에 북동남서에 맞는 좌표를 차례대로 설정해준다. 그리고 robotCleaner를 네 방향이 막혀있고 후진도 못할 때 까지 반복한다.
# 1. 에서 현재 좌표가 청소를 안한 상태(0)면 청소를 해준다(-1).
# 2. 그리고 turn 함수를 통해 방향을 왼쪽으로 바꿔준다(turn 함수는 dx와 dy 배열가 인덱스로 북동남서의 방향을 정하기 때문에 인덱스만 리턴해준다.)
# 2.a 회전한 방향의 좌표를 저장하고, 청소를 안했으면 변수 값을 회전한 곳의 좌표와 방향으로 갱신해준다.
# 2.b 청소를 한 상태거나 벽이면 현재 좌표와 회전한 방향, 그리고 막혀있다는 의미로 cnt값에 1을 더해서 갱신한다(cnt 값이 4이면 네 방향 다 막혀있는 상태)
# 2.c cnt 값이 4이면 네 방향이 다 막혀있는 상태이므로, 후진을 해야한다. 후진을 할 때는 현재 가리키는 방향이 북이면 남으로, 동이면 서 이런 식으로 반대 방향으로 가기 때문에 인덱스를 (d+2) % 4 과 같이 설정하면 반대 방향을 가리키게 된다. 후진하는 방향의 상태가 청소를 한 상태면, 후진을 할 수 있기 때문에 방향은 그대로, 후진한 좌표와 cnt값을 0으로 초기화 해서 변수를 갱신한다.
# 2.d 후진 방향이 벽이면 현재 maps에서 -1(청소한 영역)의 개수를 리턴한다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준/Python] 3190번 뱀 (0) | 2020.08.09 |
---|---|
[백준/Python] 16236번 아기 상어 (0) | 2020.06.29 |
[백준/Python] 2178번 미로 탐색 (0) | 2020.04.19 |
[백준/Python] 1260번 DFS와 BFS (0) | 2020.04.19 |
[백준/Python] 1012번 유기농배추 (0) | 2020.04.18 |