alpyrithm_알파이리즘
[알고리즘][Python] 백준(BOJ) 14503 로봇_파이썬 본문
14503 로봇 www.acmicpc.net/problem/14503
문제 풀기 전 공부할 것 : 구현, 시뮬레이션
풀이 1
<내용>
- 로봇 청소기 작동을 하나하나 다 구현해보기
- 먼저 왼쪽 방향부터 탐색하고, 한 칸 전진하는 direction 함수를 만든다.
- 현재 바라보고 있는 방향을 가준으로 왼쪽 방향과 좌표를 return 한다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우 후진하는 back 함수를 만든다.
- 현재 바라보고 있는 방향을 기준으로 현재 방향과 후진한 좌표를 return 한다.
- 로봇 청소기 작동을 구현하는 solve 함수를 만든다.
- 현재 위치가 청소 전이라면 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색을 진행한다.
<코드>
import sys
input = sys.stdin.readline
def direction(r, c, d):
if d == 0:
d = 3
c -= 1
elif d == 1:
d = 0
r -= 1
elif d == 2:
d = 1
c += 1
else:
d = 2
r += 1
return r, c, d
def back(r, c, d):
if d == 0:
r += 1
elif d == 1:
c -= 1
elif d == 2:
r -= 1
else:
c += 1
return r, c, d
def solve(r, c, d):
global res
if board[r][c] == 0:
res += 1
board[r][c] = 2
flag = False
new_r, new_c, new_d = r, c, d
for _ in range(4):
new_r, new_c, new_d = direction(new_r, new_c, new_d)
if 0 <= new_r < n and 0 <= new_c < m:
if board[new_r][new_c] == 0:
res += 1
board[new_r][new_c] = 2
flag = True
break
new_r, new_c, new_d = r, c, new_d
if flag:
return solve(new_r, new_c, new_d)
else:
new_r, new_c, d = back(r, c, d)
if 0 <= new_r < n and 0 <= new_c < m:
if board[new_r][new_c] != 1:
return solve(new_r, new_c, d)
return
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
res = 0
solve(r, c, d)
print(res)
풀이 2
<내용>
- direction과 back을 간단하게 방향만 return 하도록 한다.
- dx, dy를 통해 방향에 따라 이동할 수 있도록 해준다.
<코드>
import sys
input = sys.stdin.readline
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def direction(d):
if d == 0:
return 3
elif d == 1:
return 0
elif d == 2:
return 1
else:
return 2
def back(d):
if d == 0:
return 2
elif d == 1:
return 3
elif d == 2:
return 0
else:
return 1
def solve(r, c, d):
global res
if board[r][c] == 0:
res += 1
board[r][c] = 2
flag = False
new_r, new_c, new_d = r, c, d
for _ in range(4):
new_d = direction(new_d)
new_r, new_c = r+dx[new_d], c+dy[new_d]
if 0 <= new_r < n and 0 <= new_c < m:
if board[new_r][new_c] == 0:
res += 1
board[new_r][new_c] = 2
flag = True
break
if flag:
return solve(new_r, new_c, new_d)
else:
back_d = back(d)
new_r, new_c = r+dx[back_d], c+dy[back_d]
if 0 <= new_r < n and 0 <= new_c < m:
if board[new_r][new_c] != 1:
return solve(new_r, new_c, d)
return
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
res = 0
solve(r, c, d)
print(res)
728x90
반응형
'Algorithm > 백준 알고리즘_Python' 카테고리의 다른 글
[알고리즘][Python] 백준(BOJ) 1254 팰린드롬 만들기_파이썬 (0) | 2020.09.25 |
---|---|
[알고리즘][Python] 백준(BOJ) 1916 최소비용 구하기_파이썬 (0) | 2020.09.24 |
[알고리즘][Python] 백준(BOJ) 2458 키 순서_파이썬 (0) | 2020.09.22 |
[알고리즘][Python] 백준(BOJ) 2638 치즈_파이썬 (0) | 2020.09.21 |
[알고리즘][Python] 백준(BOJ) 12851 숨바꼭질 2_파이썬 (0) | 2020.09.20 |
Comments