BAEKJOON 14499
문제
입력
나의 처음 코드
이 문제는 평면도로 우리한테 쉬운 접근 방법을 준다. 주사위 평면도를 어떻게 하면 리스트 안에 한번에 넣을까 생각하지 말고, 따로 넣으면 된다. 십자가 모양을 ㅣ(2,1,5,6) 과 ㅡ (4,1,3) 로 따로 저장해서 우리는 문제에 진입을 하면 된다. 그러면 다음 고민이 떠오를 것이다. 주사위가 움직일 때마다 평면도가 변할 텐데 이거를 어떻게 계산해서 이러쿵저러쿵 잘 할수 있지? 당신이 펜을 들고 원리를 한번이라도 생각해봤다면 절대 이런 고민을 할리가 없다. 주사위가 좌우로 움직일 때와 위아래로 움직일 때 나타나는 규칙(?) 같은게 있다. 좌우로 구를 때는 문제의 평면도에서 보이는 2와 5는 변하지 않고 4,1,3,6 만 변할 것이고, 위아래로 움직이면 4와 3이 변하지 않고 2,1,5,6이 변할 것이다. 또한, 좌우와 위아래로 움직일 때는 평면도가 변하는 패턴이 일정하기 때문에 우리는 그 패턴만 잡고 적용해주면 된다. 코드는 아래와 같다.
N, M, x, y, K = list(map(int, input().split()))
map_list = []
for _ in range(N):
map_list.append(list(map(int, input().split())))
#주사위
line1 = [2, 1, 5, 6]
line2 = [4, 1, 3]
now_cond = [0, 0, 0, 0, 0, 0] #아래 위 왼쪽 오른쪽 앞쪽 뒤쪽
#동쪽 1, 서쪽 2, 북쪽 3, 남쪽 4
# 3
# 2 1
# 4
rl_list = [1, -1, 0, 0]
ud_list = [0, 0, -1, 1]
#좌우위아래 움직일 때 패턴, 여기서는 오른쪽 아래 왼쪽 위 순서대로이다.
dice = [[3,2,0,1], [2,3,1,0], [4,5,1,0], [5,4,0,1]]
dice_idx = [[0,1,2,3], [0,1,2,3], [0,1,4,5], [0,1,4,5]]
op_list = list(map(int, input().split()))
for op in op_list:
change = False
tmp_x = x + ud_list[op-1]
tmp_y = y + rl_list[op-1]
#좌표안의 값을 만족할 때
if 0 <= tmp_x < N and 0 <= tmp_y < M:
x, y = tmp_x, tmp_y
next_val = map_list[tmp_x][tmp_y]
tmp_cond = now_cond.copy()
#주사위 평면 변화
for i in range(4):
now_cond[dice_idx[op-1][i]] = tmp_cond[dice[op-1][i]]
change = True
#움직였을 때
if change:
#간 칸이 0일 때
if map_list[tmp_x][tmp_y] == 0:
map_list[tmp_x][tmp_y] = now_cond[0]
print(now_cond[1])
#간 칸이 0이 아닐 때
else:
now_cond[0] = map_list[tmp_x][tmp_y]
map_list[tmp_x][tmp_y] = 0
print(now_cond[1])
주사위가 변화는 모양을 생각하고 규칙을 생각하면 그리 어려운 문제는 아니다. 호호