728x90
- 1 x 1 크기읮 ㅓㅇ사각형으로 이뤄진 N x M 크기의 직사각형
- 각 칸은 육지 or 바다
- 캐릭터는 동서남북 중 한 곳 바라봄
- 각 칸은 (A, B) 로 나타냄
- A는 북쪽으로부터 떨어진 칸의 개수
- B는 서쪽으로부터 떨어진 칸의 개수
- 캐릭터는 상하좌우로 움직일 수 있음
- 바다로 되어 있는 공간에는 갈 수 없음
< 매뉴얼 >
1) 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 갈 곳 정함
2-1) 왼쪽 방향에 아직 가보지 않은 칸 존재하면, 왼쪽 방향으로 회전한 후 왼쪽으로 한 칸 전진
2-2) 왼쪽 방향에 가보지 않은 칸 없으면, 왼쪽 방향으로 회전한 후 1)로 돌아감
3) 네 방향 모두 이미 가본 칸 or 바다로 되어 있는 칸이면, 바라보는 방향 유지한 채로 한 칸 뒤로 가고 1)로 돌아감
뒤쪽 방향이 바다 칸인 경우 움직임 멈춤
=> 캐릭터가 방문한 칸의 수 출력
- A, B 좌표와 방향 d 입력 받음
- d는 0(북쪽), 1(동쪽), 2(남쪽), 3(서쪽)
- 맴이 육지인지 바다인지에 대한 정보 입력
- 0(육지), 1(바다)
# 맵 크기 입력
n, m = map(int, input().split())
d = [[0] * m for _ in range(n)]
# 현재 좌표, 방향 입력
x, y, direction = map(int, input().split())
d[x][y] = 1
data = []
for i in range(n):
data.append(list(map(int, input().split())))
# 동서남북 방향
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 왼쪽으로 회전하는 함수
def turn_left():
global direction
direction -= 1
if direction == -1:
direction = 3
cnt = 1
turn_time = 0
while True:
# 왼쪽으로 회전
turn_left()
nx = x + dx[direction]
ny = y + dy[direction]
# 가보지 않은 칸이 존재하는 경우 => 이동
if d[nx][ny] == 0 and data[nx][ny] == 0:
d[nx][ny] = 1
x = nx
y = ny
cnt += 1
turn_time = 0
continue
# 가보지 않은 칸이 없구나 바다인 경우
else:
turn_time += 1
# 네 방향 모두 갈 수 없는 경우
if turn_time == 4:
nx = x - dx[direction]
ny = y - dy[direction]
# 뒤로 갈 수 있으면 이동
if data[nx][ny] == 0:
x = nx
y = ny
# 뒤가 바다이면
else:
break
turn_time = 0
print(cnt)
반응형
'전.py' 카테고리의 다른 글
[python] DFS & BFS (0) | 2022.07.08 |
---|---|
[python] 팩토리얼 (0) | 2022.07.08 |
[python] 왕실의 나이트 (0) | 2022.07.07 |
[python] 시각 (0) | 2022.07.07 |
[python] 상하좌우 (0) | 2022.07.07 |