p.118쪽
코드
n, m = map(int, input().split())
start_x, start_y, state = map(int, input().split())
arrow_move = {0:[-1, 0], 1:[0, 1], 2:[-1,0], 3:[0,-1]}
# 북, 동, 남, 서
world = []
for h in range(n):
list()
world.append(list(map(int, input().split())))
cur_y, cur_x = start_y, start_x
# 방문한건 바다로 변경하자.
round = 0
result = 1
tp_count = 0
while(True):
if tp_count == 4: # 4방향을 다 돌았는데도 이동할 없으면 뒤로 한칸
if world[cur_y + arrow_move[(round + 2) % 4][0]][cur_x + arrow_move[(round +2 )% 4 ][1]] == 1:
break
else:
print("여기서 갱신")
world[cur_y + arrow_move[(round +2) %4]][0][cur_x + arrow_move[(round + 2)% 4][1]] = 1
cur_y += arrow_move[(round+2 % 4)][0]
cur_x += arrow_move[(round +2)% 4][1]
if world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] == 0: # 방문한 적 없다면(바다가 아니라면) 이동하고 현재위치 갱신
print("갱신")
world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] = 1
cur_y += arrow_move[round % 4][0]
cur_x += arrow_move[round % 4][1]
result += 1
tp_count = 0
else:
pass
tp_count += 1
round += 1
print(result)
접근했던 방법
- 동,서,남,북 중 하나의 방향으로 움직일 때 움직이는 좌표 방향을 dictionary로 지정해둠
arrow_move = {0:[-1, 0], 1:[0, 1], 2:[-1,0], 3:[0,-1]}
- 타일 하나를 방문했을 경우 그 타일을 1로 바꿔서 바다와 같은 취급을 했음
world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] = 1
- tp_count 변수로 4방향 모두에 이동이 불가할 경우, 뒤로 가게하고, 뒤로도 못 갈 경우 종료시킴
- mod 연산 이후 + 2를 더해주면 index가 초과되는 경우를 대비하여 +2 연산 이후 mod 연산을 해줌
- 북, 동, 남, 서의 순환하는 순서로 뒀기 때문에 +2를 먼저 해주고 mod를 취하는것과, mod 이후 +2를 해주는 것의 결과 차이가 없음
서적 참고하여 피드백
- global 키워드를 통한 직관적 기능구현
turn_left()
- 위 함수만 보이니 직관적임
- direction 변수와 dx, dy 리스트를 활용하여 깔끔하게 회전 기능 구현한 것에 주목
- 내가 이게 처음 할 때 잘 안되는 부분임. 이 부분이 매끄러워야 빠른 문제 해결이 가능할 것임
- continue를 활용하여 코드가 내가 원하는 방식대로 흘러갈 수 있도록 함
- continue 키워드는 반복문의 최초 지점으로 되돌아감
- (내가 놓친 부분) 4방향 다 막히거나 바다에 빠졌을 경우엔 방문했던 육지여도 뒤로 한칸 가는것임
- 난 이 부분 고려 못해서, if문에서 가보지 않고, 육지인 경우에만 이동하게 했음
PREVIOUS경제