문제
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
알고리즘
- dfs 탐색을 통해 문제를 수행한다.
- 반복문을 통해 현재 방향에서 왼쪽 방향씩을 확인한다.
- 현재 방향 + 3을 4로 나눈 나머지가 왼쪽 방향이다.
- 이동하려는 위치가 빈 곳이라면 탐색을 하고 현재 방향을 변경한다.
- 4방향 모두 탐색했다면 후진 방향을 확인한다.
- 현재 방향 + 2를 4로 나눈 나머지가 후진 방향이다.
- 이동 위치가 벽이라면 리턴하고 벽이 아니라면 탐색한다.
코드
import sys
def dfs(x, y, v):
global answer
# 빈 곳이면 청소
if graph[x][y] == 0:
graph[x][y] = 2 # 방문 처리
answer += 1 # 청소 구역 카운트
# 반복문을 통해 4방향 확인
for _ in range(4):
nv = (v + 3) % 4 # 현재 방향 + 3을 4로 나눈 나머지가 왼쪽 방향
nx = x + dx[nv]
ny = y + dy[nv]
# 이동 위치가 빈 곳이면 탐색
if graph[nx][ny] == 0:
dfs(nx, ny, nv)
return
# 현재 방향 변경
v = nv
# 4방향 모두 탐색했다면
nv = (v + 2) % 4 # 현재방향 + 2를 4로 나눈 나머지가 후진 방향
nx = x + dx[nv]
ny = y + dy[nv]
# 이동 위치가 벽이라면 리턴
if graph[nx][ny] == 1:
return
# 이동 위치가 벽이 아니라면 탐색
dfs(nx, ny, v)
n, m = map(int, sys.stdin.readline().split())
r, c, d = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
# d => 0,3,2,1 순서로 돌아야함. 북/서/남/동
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
answer = 0
dfs(r, c, d)
print(answer)
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 2225번(파이썬): 합분해 (0) | 2022.05.07 |
---|---|
[baekjoon] 백준 2133번(파이썬): 타일 채우기 (0) | 2022.05.06 |
[baekjoon] 백준 15686번(파이썬): 치킨 배달 (0) | 2022.05.04 |
[baekjoon] 백준 18111번(파이썬): 마인크래프트 (0) | 2022.05.02 |
[baekjoon] 백준 1759번(파이썬): 암호 만들기 (0) | 2022.05.01 |