Algorithm/Implementation

[백준 14499번] 주사위 굴리기

킹우현 2023. 8. 30. 15:07

n, m, dice_x, dice_y, k = map(int,input().split())

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

move_list = list(map(int,input().split()))

dx = [0,0,0,-1,1]
dy = [0,1,-1,0,0]

# 상단, 남, 동, 서, 북, 하단
dice = [0 for _ in range(6)]

for move in move_list:
    dice_x += dx[move]
    dice_y += dy[move]

    if dice_x < 0 or dice_x >= n or dice_y < 0 or dice_y >=m:
        dice_x -= dx[move]
        dice_y -= dy[move]
        continue

    if move == 1: # 동쪽
        # 상단, 동, 서, 하단 변화
        dice = [dice[3],dice[1] ,dice[0],dice[5],dice[4] ,dice[2]]
    elif move == 2: # 서쪽
        # 상단, 동, 서, 하단 변화
        dice= [dice[2],dice[1] ,dice[5],dice[0],dice[4] ,dice[3]]
    elif move == 3: # 북쪽
        # 상단, 북, 하단, 남 변화
        dice = [dice[1],dice[5], dice[2], dice[3] , dice[0],dice[4]]
    elif move == 4: # 남쪽
        # 상단, 북, 하단, 남 변화
        dice = [dice[4],dice[0], dice[2], dice[3] , dice[5],dice[1]]
        
    if area[dice_x][dice_y] == 0 : # 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수를 칸에 복사
        area[dice_x][dice_y] = dice[-1]
    else: # 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0
        dice[-1] = area[dice_x][dice_y]
        area[dice_x][dice_y] = 0
    
    print(dice[0])

이번 문제는 주어진 영역의 (x,y) 좌표에서 주사위가 처음으로 시작했을 때, 이동시킬 때 마다 주사위에 적힌 값이 업데이트된다는 가정하에 매 이동 시마다 상단에 쓰여진 값을 출력하는 문제이다.

 

처음에는 주사위가 굴려지는 과정을 잘못 이해하여 리스트를 Shift 하면서 구했었는데, 값이 제대로 나오지 않아 dice의 값을 직접 수정해주는 방식으로 구현하였다.

 

간단한 구현문제 였지만, 2차원 배열의 위치를 이동함과 동시에 주어진 주사위의 값을 하나의 리스트로 관리하면서 정확한 결과를 도출해낼 수 있는 재미있는 문제였다 :)

 

배운 점 및 느낀 점

  1. 구현 문제는 주석을 최대한 적어가며 풀면 보다 수월하게 풀 수 있다.
  2. 디버깅을 수시로 해보며 내가 생각한 로직이 맞는지 확인하는 습관은 중요하다.