My code
n,m = map(int,input().split()) #map 의 세로와 가로 크기를 입력 받음
a,b,d = map(int,input().split()) #현재 캐릭터의 좌표값과 방향을 입력 받음
went = [[0]*m for i in range(n)] #방문했음을 표시하는 배열 만들어줌
went[a][b] = 1 #현재 캐릭터의 위치에 방문했음을 표시
array = []
for i in range(n):
array.append(list(map(int,input().split()))) #map 의 육지,바다 값을 입력 받아 줌
da = [-1,0,1,0] #북,남을 나타내는 방향 변수
db = [0,1,0,-1] #동,서를 나타내는 방향 변수
def turn_left(): #왼쪽으로 회전하는 함수
global d
d -= 1 #회전하면 -1한 값이므로 1빼줌
if d == -1: #북에서 서로 회전했을 때는 3이므로 3으로 설정
d = 3
turn_time = 0 #캐릭터가 회전한 횟수를 저장할 변수(4번 회전하면 갈 곳이 없다는 뜻)
count = 1 #방문한 칸수를 count 해줄 변수(처음 위치 방문 count 하여 시작)
while True:
turn_left() #왼쪽으로 회전
na = a + da[d] #회전한 방향에서의 값을 좌표에 더해줌
nb = b + db[d]
if went[na][nb] == 0 and array[na][nb] == 0: #만약 더해준 위치의 값이 방문하지 않았거나 육지일 때
a = na #좌표를 이동
b = nb
went[a][b] = 1 #방문했다고 표시
count += 1 #방문 칸 수 count 해줌
turn_time = 0 #이동 했으므로 turn_time 초기화
continue #처음부터 다시 반복
else:
turn_time += 1 #갈 곳이 없다면 turn_time 증가시켜 준 뒤 다시 반복
if turn_time == 4: #만약 4번을 turn 했다면
na = a - da[d] #뒤로 이동
nb = b - db[d]
if array[na][nb] == 0 : #뒤의 칸이 육지라면
a = na #좌표값 뒤로 변경
b = nb
else:
break
turn_time = 0
print(count)
Code Review
이번 문제는 여러가지 경우를 고려하여 그에 맞는 알고리즘을 작성해야 하는 비교적 어려운 문제였습니다. 문제를 해결하기 위해 왼쪽으로 회전하는 함수, 해당 칸에 방문 했음을 표시하는 array, 방향을 나타내는 변수 등이 필요했습니다. 따라서 이를 적절하게 구현해주었습니다. 구현한 함수와 변수들을 이용하여 캐릭터가 이동하는 방향을 조건에 맞게 설계해주었습니다. 처음 알고리즘을 구현하였을 때 캐릭터의 시작 위치를 방문처리 하지 않았다는 문제점과 만약 4방향 모두 회전하였을 때 뒤의 칸이 육지라면 한칸 뒤로 이동하고 그렇지 않다면 움직임을 멈추는 알고리즘 구현에 있어서 부족함이 있었습니다. 따라서 이러한 점을 보완하여 구현할 수 있었습니다.
댓글