[코드트리 파이썬] 이동경로상에 있는 모든 숫자 더하기

문제


풀이

현재 위치에서 회전하며 격자를 이동해야 하므로 먼저 이동방향에 대해 정의하였다.

 

x = N // 2
y = N // 2
res = matrix[y][x]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

direction = ["E", "S", "W", "N"]
nDirection = 3

시작위치는 격자의 정중앙이므로 x, y의 좌표는 격자의 크기 // 2 로 구하였다.

 direction배열은 실제로 쓰이진않지만 숫자로 표현된 현재 방향에 대해 헷갈리지 않기 위해 만들었다.

0 -> E, 1 -> S, 2 -> W, 3 -> N로 정의한다.

시작방향은 N이기 때문에 3으로 초기화시켜주었다.

 

for i in moving:
    if i == "R":
        nDirection += 1
    elif i == "L":
        nDirection -= 1
    elif i == "F":
        moveDirect = abs(nDirection % 4)
        nx = x + dx[moveDirect]
        ny = y + dy[moveDirect]

        if 0 <= nx < N and 0 <= ny < N:
            x = nx
            y = ny
            res += matrix[y][x]

방향을 바꾸고 이동하는 코드이다.

명령이 R일경우는 시계방향회전이므로 방향을 1 증가시킨다. L일경우는 반시계이므로 -1을 해준다.

F일경우는 이동이므로 이동방향을 결정한다.

현재 방향에서 4를나눈 나머지에 절대값을 씌워 이동방향을 결정한다.

그 후 실제로 이동한 좌표를 계산후 해당 좌표가 격자안에 존재하여 유효하다면 이동 후 결과값을 증가시킨다.

 

 

코드

N, T = map(int, input().split())

moving = list(input())

matrix = [list(map(int, input().split())) for _ in range(N)]

x = N // 2
y = N // 2
res = matrix[y][x]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

direction = ["E", "S", "W", "N"]
nDirection = 3


for i in moving:
    if i == "R":
        nDirection += 1
    elif i == "L":
        nDirection -= 1
    elif i == "F":
        moveDirect = abs(nDirection % 4)
        nx = x + dx[moveDirect]
        ny = y + dy[moveDirect]

        if 0 <= nx < N and 0 <= ny < N:
            x = nx
            y = ny
            res += matrix[y][x]
    
print(res)