💻 입력 조건
💻 출력 조건
💻 입력 예시
4 4 # 4 x 4 맵 생성 1 1 0 # (1, 1)에 북쪽(0)을 바라보고 서 있는 캐릭터 1 1 1 1 # 첫 줄은 모두 바다 1 0 0 1 # 둘째 줄은 바다/육지/육지/바다 1 1 0 1 # 셋째 줄은 바다/바다/육지/바다 1 1 1 1 # 넷째 줄은 모두 바다
💻 출력 예시
3
📖 문제 해결
문제에서 제시한 이동 방법을 차근차근 구현함으로써 문제를 해결할 수 있었습니다. 특히 방향을 저장해 놓은 변수 d
를 리스트 dx
와 dy
의 인덱스로 사용함으로써 코드를 보다 간결하게 작성할 수 있었습니다. (답안 코드는 책의 코드를 참고 및 이해 후 작성한 코드입니다.)
# n, m 입력받기
n, m = list(map(int,input().split()))
# a, b, d 입력받기
a, b, d = list(map(int,input().split()))
# map_의 정보 입력받기
map_ = []
for i in range(n):
map_.append(list(map(int,input().split())))
# direction 및 dx, dy 설정
direction = [0,1,2,3]
dx = [-1, 0, +1, 0]
dy = [0, +1, 0, -1]
# 왼쪽으로 회전하는 함수인 turn_left
def turn_left():
global d
d -= 1
if d == -1:
d = 3
# 방문을 한 곳인지 아닌 지를 확인하기 위한 2차원 리스트 reference
reference = [[0]*n for _ in range(n)]
result = 0
turn_count = 0
while True :
# 왼쪽으로 회전
turn_left()
# 회전 후 전진했을 때 육지이고, 방문한 적이 없는 곳이라면 방문
if map_[a + dx[d]][b + dy[d]] == 0 and reference[a + dx[d]][b + dy[d]] == 0:
a = a + dx[d]
b = b + dy[d]
reference[a][b] = 1
result += 1
turn_count = 0
continue
# 그렇지 않다면 turn_count += 1
else :
turn_count += 1
# 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우
# 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아감
if turn_count == 4:
# 단, 이때 뒤쪽 방향이 육지가 아닌 바다인 칸이면 움직임을 멈춤
if map_[a - dx[d]][b - dy[d]] != 0:
break
else :
a = a - dx[d]
b = b - dy[d]
turn_count = 0
# 캐릭터가 방문한 칸의 수를 출력
print(result)