파이썬으로 부시자! Python with Coreenee

BAEKJOON 14499

문제

스크린샷 2020-05-02 오후 11 14 44

입력

스크린샷 2020-05-02 오후 11 14 50


나의 처음 코드

이 문제는 평면도로 우리한테 쉬운 접근 방법을 준다. 주사위 평면도를 어떻게 하면 리스트 안에 한번에 넣을까 생각하지 말고, 따로 넣으면 된다. 십자가 모양을 ㅣ(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])

주사위가 변화는 모양을 생각하고 규칙을 생각하면 그리 어려운 문제는 아니다. 호호