문제를 처음 읽을 때, 조금 막막한 문제였습니다. 다른 풀이를 찾아보며 푸는 방식에 대하여 배우게 되었고 이해하여 풀어내었습니다.
일단 준비물이 필요합니다. 지도의 상황을 담을 form, 주사위의 상황을 담을 dice, 동서남북 방향을 다뤄줄 dx, dy 방향을 지시해줄 action, 각각의 데이터를 담아놓고 풀이를 시작하였습니다.
일단 action을 순서대로 하나씩 꺼내주며 하나도 남지 않으면 끝나도록 하였습니다.
action에서 명령을 꺼내어 해당 방향으로 이동했을 때 지도 바깥으로 이동하게 되는지를 확인하여 지도 밖으로 이동하게 하는 명령일 경우에는 continue로 건너뛰어 줍니다.
지도 밖으로 이동하지 않는 명령이라면 판단을 시작합니다. 각 key 값의 방향별로 이동 했을 때의 주사위 상태로 주사위 값들을 변경 시켜줍니다(이 부분이 가장 중요).
2
4 1 3
5
6
위 주사위 도면을 가지고 주사위를 만든다고 생각하면 바닥이 1, 동쪽벽 3, 서쪽벽 4, 남쪽벽 5, 북쪽벽 2, 천장이 6 으로 위치를 볼 수 있습니다. 이 주사위가 예를들어 동쪽 방향으로 굴렀을 때를 예상해 보면 바닥이 3, 동쪽벽 6, 서쪽벽 1, 남쪽벽 5, 북쪽벽 2, 천장이 4 이렇게 변화하게 됩니다.
위와 같은 방식으로 주사위 값들이 변하도록 만들어 준 뒤, 천장 벽의 수를 출력해 준 뒤 문제 설명에 나온 바닥칸의 동작을 실행해 줍니다.( 지도 바닥이 0일 때에는 주사위 바닥 수를 지도 바닥에 복사, 지도 바닥이 0이 아닐 때에는 지도 바닥 수를 주사위 바닥에 복사해 준 뒤 지도 바닥을 0으로 변환)
이 과정을 action이 끝날 떄 까지 반복하여 풀이 해줍니다.
#settings!###
n, m, x, y, k = map(int, input().split());
form = [];
for i in range(n):
form.append(list(map(int, input().split())));
action = list(map(int, input().split()));
#solution!###
dice = [0,0,0,0,0,0,0]; #주사위의 상태
dx = [0, 0, 0, -1, 1]; #각각 방향으로 움직일때, 주사위의 위치를 변경시켜주는 도구
dy = [0, 1, -1, 0, 0]; #각각 방향으로 움직일때, 주사위의 위치를 변경시켜주는 도구
now_x = x;
now_y = y;
while len(action)>0:
key = action.pop(0); #이번에 판단할 명령
nx = dx[key] + now_x; #이동할 칸 좌표
ny = dy[key] + now_y;
if n <= nx or m <= ny or nx < 0 or ny < 0: #바깥으로 이동하는 경우 건너 뛰어줍니다.
continue;
else:
now_x = nx;
now_y = ny;
if key == 1: #주사위가 동쪽으로 구를 경우
#주사위가 굴렀을때 값들이 위치하게 될 곳을 예상하여 값을 바꾸어 줍니다.
dice = [0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]];
#이동한 지도 바닥 값이 0이라면 주사위 바닥 값을 지도 바닥에 복사해 줍니다.
if form[now_x][now_y] == 0:
form[now_x][now_y] = dice[1];
#이동한 지도 바닥 값이 0이 아니라면 지도 바닥 값을 주사위 바닥에 복사해 주고, 지도 바닥 값을 0으로 변경해 줍니다.
else:
dice[1] = form[now_x][now_y];
form[now_x][now_y] = 0;
#주사위 천장값 출력
print(dice[6]);
elif key == 2: #주사위가 서쪽으로 구를 경우
dice = [0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]];
if form[now_x][now_y] == 0:
form[now_x][now_y] = dice[1];
else:
dice[1] = form[now_x][now_y];
form[now_x][now_y] = 0;
print(dice[6]);
elif key == 3: #주사위가 북쪽으로 구를 경우
dice = [0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]];
if form[now_x][now_y] == 0:
form[now_x][now_y] = dice[1];
else:
dice[1] = form[now_x][now_y];
form[now_x][now_y] = 0;
print(dice[6]);
else : #주사위가 남쪽으로 구를 경우
dice = [0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]];
if form[now_x][now_y] == 0:
form[now_x][now_y] = dice[1];
else:
dice[1] = form[now_x][now_y];
form[now_x][now_y] = 0;
print(dice[6]);