728x90
728x90
👩🏻💻 code
import sys
from typing import MappingView
sys.stdin = open("input.txt","rt")
input = sys.stdin.readline
n,m=map(int,input().split())
x,y,d=map(int,input().split())
map=list(list(map(int,input().split())) for _ in range(n))
visit=[[0]*m for _ in range(n)]
# 북서남동
dx=[-1,0,1,0]
dy=[0,-1,0,1]
rotate_count=0
visit[x][y]=1
count=1
while True:
d = d-1 if (d!=0) else 3
nx,ny=x+dx[d],y+dy[d]
# 회전한 이후, 정면에 안 가본 칸 있을 때
if map[nx][ny]==0 and visit[nx][ny]==0 :
visit[nx][ny]=1
rotate_count=0
count+=1
x,y=nx,ny
continue
else: # 회전한 이후, 가보지않은 칸이 없거나 바다인경우
rotate_count+=1
# 네 방향 모두 못감
if rotate_count==4 :
# 뒤로 이동 시
behind=(d+2)%4
nx,ny=x+dx[behind],y+dy[behind]
# behind 안쓰고 바로 nx,ny= x-dx[d], y-dy[d] 이렇게 해도 됨.
# 뒤로 갈수있음
if map[nx][ny]==0:
x,y=nx,ny # 이미 방문한곳이므로 x,y만 변경해주고, visit와 count는 변경 팔요 x
# 뒤가 바다라 못감
else:
break
rotate_count=0
print(count)
🌈 해설
처음에 문제의 조건이 헷갈렸음.
2번 조건에서 '왼쪽 방향에 가보지 않은 칸이 없다면' 는 바다인 칸도 포함한거였다. ( 말그대로 그냥 0의 값을 가지는 칸이 없다면! 이라는 뜻)
# 0,3,2,1 -> 북서남동
- 반시계 방향으로 움직인다고 했으므로 뱡향을 북서남동 순으로 함 (책에선 북동남서)
- d = d-1 if (d!=0) else 3 로 방향을 왼쪽으로 회전해줌.
(0->3 , 3->2, 2->1, 1->0 이므로)
- rotate_count 라는 변수를 사용해서 회전횟수를 체크함
- 뒤로 이동 시 (0->2, 1->3, 2->0, 3->1)
나는 (d+2)%4 를 사용해서 방향 전환을 해줬음.
(책 풀이) nx,ny= x-dx[d], y-dy[d]
728x90
728x90
'Algorithm > 이코테' 카테고리의 다른 글
[이코테] 미로 탈출 / 파이썬 / python / BFS (0) | 2021.09.03 |
---|---|
[이코테] 음료수 얼려먹기 / 파이썬 / python / DFS (0) | 2021.09.03 |
[이코테] 왕실의 나이트 / 파이썬 / python / 구현 (0) | 2021.08.24 |
[이코테] 1이 될 때까지 / 파이썬 / python / 그리디 (0) | 2021.08.24 |
[이코테] 숫자 카드 게임 / 파이썬 / python / 그리디 (0) | 2021.08.24 |
댓글