티스토리 뷰
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
풀이
# 입력값 받기
n, m = map(int, input().split())
r, c, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(n)]
# 북, 동, 남, 서 방향 이동 좌표
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 현재 위치 청소
def clean(x, y):
room[x][y] = 2
# 현재 위치에서 왼쪽 방향으로 회전한 방향 반환
def turn_left(d):
return (d + 3) % 4
# 후진할 위치 반환
def back(x, y, d):
return x - dx[d], y - dy[d]
# 현재 위치에서 탐색 시작
def dfs(x, y, d):
# 현재 위치 청소
clean(x, y)
# 네 방향 모두 확인
for _ in range(4):
# 현재 방향에서 왼쪽 방향으로 회전
nd = turn_left(d)
# 다음 이동할 위치
nx, ny = x + dx[nd], y + dy[nd]
# 이동할 위치가 청소하지 않은 곳이면 이동하고 dfs 실행
if room[nx][ny] == 0:
dfs(nx, ny, nd)
return
# 이동할 위치가 청소한 곳이거나 벽이면 회전만 하고 다시 반복
else:
d = nd
# 네 방향 모두 청소가 된 경우 후진하고 다시 실행
bx, by = back(x, y, d)
if room[bx][by] != 1:
dfs(bx, by, d)
# 로봇 청소기 이동 시작
dfs(r, c, d)
# 청소한 구역 수 출력
count = 0
for i in range(n):
for j in range(m):
if room[i][j] == 2:
count += 1
print(count)
'개발자를 위한 한 걸음 > 코딩 문제' 카테고리의 다른 글
순위 검색 - 프로그래머스 lv.2 (0) | 2023.03.31 |
---|---|
메뉴 리뉴얼 - 프로그래머스 lv.2 (0) | 2023.03.31 |
스타트와 링크 - 백준 #14889, 실버2, 브루트포스/백트래킹 (0) | 2023.03.30 |
토마토 - 백준 #7576, 그래프/너비 우선 탐색 (0) | 2023.03.22 |
롤케이크 자르기 - 프로그래머스 lv.2 (0) | 2023.03.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 시뮬레이션
- 리트코드
- 정렬
- 실버3
- Python
- 백준
- 그래프 탐색
- 실버2
- lv.3
- 백트래킹
- 깊이 우선 탐색
- 카카오
- 그리디 알고리즘
- 구현
- 골드5
- 문자열
- 코딩테스트
- 수학
- 카카오 코딩테스트
- 프로그래머스
- lv.2
- leetcode
- 그래프 이론
- Simulation
- 릿코드
- 코딩 테스트
- 다이나믹 프로그래밍
- 브루트포스 알고리즘
- 코드트리
- 너비 우선 탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함