현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 x 1 크기의 정사각형으로 이뤄진 N x M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터는 동서남북 중 한 곳을 바라본다.
맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다. 캐릭터의 움직임을 설정하기 위해 정해 놓은 매뉴얼은 이러하다.
현민이는 위 과정을 반복적으로 수행하면서 캐릭터의 움직임에 이상이 있는지 테스트하려고 한다. 매뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 만드시오.
0 : 북쪽
1 : 동쪽
2 : 남쪽
3 : 서쪽
0 : 육지
1 : 바다
4 4
1 1 0
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1
3
일단 문제 읽으면서 체크해야 하는 부분들을 먼저 챙겼습니다.
이러한 변수들이 필요함을 체크하고 일단은 While True로 무한 반복문을 돌리면서 작성했습니당.
코드 작성 전반
- 데이터 입력 받기
- 북, 동, 남, 서 방향 설정
- 반복문 돌리기
- 이동할 수 있는 칸일 때
- 이동하지 못 할 때
- 4 방향 모두 회전해도 이동하지 못 할 때
- 왼쪽으로 회전하는 함수
이러한 흐름으로 코드를 작성했습니다!
# 왼쪽으로 회전하는 함수
def turn_left():
global direction
direction += 1
if direction == 4:
direction = 0
# 데이터 입력 받기
n, m = map(int, input().split())
x, y, direction = map(int, input().split())
arr = []
for i in range(n):
arr.append(list(map(int, input().split()))
move = [[-1, 0], # 북
[0, -1], # 동
[1, 0], # 남
[0, 1]] # 서
# 방문한 위치 파악을 위한 지도
my = [[0] * m for _ in range(n)]
my[x][y] = 1 # 현재 위치 방문 처리
cnt = 1
turn_time = 0
while True:
turn_left()
nx = x + move[direction][0]
ny = y + move[direction][1]
# 육지고 방문한 적 없는 칸이면 이동하기
if arr[nx][ny] == 0 and my[nx][ny] == 0:
my[nx][ny] = 1
x = nx
y = ny
cnt += 1
turn_time = 0
continue
else:
turn += 1
# 네 방향 모두 회전해도 이동할 수 없을 때
if turn_time == 4:
# 현재 바라보는 방향 유지한 채로 한 칸 뒤로 이동
nx = x - move[direction][0]
ny = y - move[direction][1]
if arr[nx][ny] == 0:
x = nx
y = ny
else: # 뒤가 바다로 막힌 경우
break
turn_time = 0
print(cnt)
예전에는 문제 대충 훑어보고 겁부터 먹었는데 하루 한 문제씩 꾸준히 풀다보니 조금 나아진 것 같아요 :)