문제
풀이
현재 위치에서 회전하며 격자를 이동해야 하므로 먼저 이동방향에 대해 정의하였다.
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)
'알고리즘' 카테고리의 다른 글
[코드트리 파이썬] 팀으로 하는 틱택토 (0) | 2024.03.21 |
---|---|
[코드트리 파이썬] 우리는 하나 (0) | 2024.03.18 |
[코드트리 파이썬] 뿌요뿌요 (0) | 2024.03.14 |
[코드트리 파이썬] 양수 직사각형의 최대 크기 (0) | 2024.03.09 |
[코드트리 파이썬] 회의실 겹치지 않게 하기 (0) | 2024.03.07 |