본문 바로가기
Python/백준

백준 주사위 굴리기 [14499] Python 코드 + 해설

by Guardy 2024. 10. 22.
728x90
반응형

백준 주사위 굴리기 14499 파이썬(Python) 정답 코드 및 해설입니다.

이 문제에서는 N x M 크기의 지도 위에 주사위가 놓여 있고, 주어진 명령에 따라 주사위를 굴리면서 특정 규칙에 따라 지도의 숫자와 주사위의 숫자를 변경한다.

주사위의 초기 상태와 전개도

주사위의 초기 전개도는 다음과 같다:


  2
4 1 3
  5
  6
  • 윗면: 1
  • 아랫면: 6
  • 앞면: 5
  • 뒷면: 2
  • 왼쪽 면: 4
  • 오른쪽 면: 3

주사위의 모든 면에는 처음에 0이 적혀 있다.

이동 규칙

  1. 주사위를 이동시킨다.
    • 이동 방향은 동쪽(1), 서쪽(2), 북쪽(3), 남쪽(4)이다.
    • 주사위를 이동시킬 때 지도의 바깥으로 이동하려고 하면 그 명령은 무시한다.
  2. 이동한 칸에 쓰여 있는 수에 따라 다음을 수행한다:
    • 칸의 수가 0이면: 주사위의 바닥면에 쓰여 있는 수를 칸에 복사한다.
    • 칸의 수가 0이 아니면: 칸에 쓰여 있는 수를 주사위의 바닥면에 복사하고, 칸의 수는 0이 된다.
  3. 각 이동이 끝날 때마다 주사위의 윗면에 쓰여 있는 수를 출력한다.

해결 방법: 시뮬레이션

이 문제는 주사위의 상태와 지도의 상태를 관리하면서 주어진 명령대로 시뮬레이션하면 된다.

구현 단계

  1. 입력 받기
    • 지도의 크기 N, M과 주사위의 초기 위치 x, y, 명령의 개수 K를 입력받는다.
    • 지도의 정보를 2차원 리스트 board에 저장한다.
    • 명령 리스트 commands를 입력받는다.
  2. 주사위 상태 관리
    • 주사위의 각 면을 관리하기 위해 리스트 dice를 사용한다.
      • dice[0]: 윗면
      • dice[1]: 아랫면
      • dice[2]: 앞면
      • dice[3]: 뒷면
      • dice[4]: 왼쪽 면
      • dice[5]: 오른쪽 면
  3. 주사위 굴리기 함수 구현
    • 주사위를 굴리는 함수를 만들어 각 명령에 따라 주사위의 면을 회전시킨다.
    • 방향에 따라 주사위의 면이 어떻게 변하는지 구현한다.
  4. 시뮬레이션 실행
    • 각 명령에 대해 다음을 수행한다:
      • 이동하려는 위치가 지도의 범위를 벗어나면 명령을 무시한다.
      • 주사위를 굴리고 위치를 업데이트한다.
      • 지도의 칸에 쓰여 있는 수에 따라 주사위와 지도의 값을 변경한다.
      • 주사위의 윗면의 값을 출력한다.

최종 정답 코드(Python)

N, M, x, y, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
commands = list(map(int, input().split()))

# 주사위 초기 상태
dice = [0] * 6  # 윗, 아랫, 앞, 뒷, 왼, 오른

# 이동 방향: 동, 서, 북, 남
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

for cmd in commands:
    dir = cmd - 1
    nx = x + dx[dir]
    ny = y + dy[dir]

    # 지도를 벗어나면 명령 무시
    if not (0 <= nx < N and 0 <= ny < M):
        continue

    # 주사위 굴리기
    if dir == 0:  # 동
        dice[0], dice[1], dice[4], dice[5] = dice[4], dice[5], dice[1], dice[0]
    elif dir == 1:  # 서
        dice[0], dice[1], dice[4], dice[5] = dice[5], dice[4], dice[0], dice[1]
    elif dir == 2:  # 북
        dice[0], dice[1], dice[2], dice[3] = dice[2], dice[3], dice[1], dice[0]
    else:  # 남
        dice[0], dice[1], dice[2], dice[3] = dice[3], dice[2], dice[0], dice[1]

    x, y = nx, ny  # 위치 업데이트

    if board[x][y] == 0:
        board[x][y] = dice[1]
    else:
        dice[1] = board[x][y]
        board[x][y] = 0

    print(dice[0])

14499 정답

핵심 포인트

  • 주사위의 면을 리스트로 관리한다: 주사위의 각 면을 리스트의 인덱스로 관리하면 회전 시 면의 값 변경이 편리하다.
  • 이동 방향에 따른 면의 변화:
    • 동쪽 이동: 윗면, 아랫면, 왼쪽 면, 오른쪽 면이 회전한다.
    • 서쪽 이동: 윗면, 아랫면, 왼쪽 면, 오른쪽 면이 반대로 회전한다.
    • 북쪽 이동: 윗면, 아랫면, 앞면, 뒷면이 회전한다.
    • 남쪽 이동: 윗면, 아랫면, 앞면, 뒷면이 반대로 회전한다.
  • 시뮬레이션의 정확한 구현: 주사위의 상태와 지도의 상태를 정확히 업데이트해야 한다.
  • 명령의 무시 조건 처리: 지도의 범위를 벗어나는 명령은 반드시 무시하고 출력을 하지 않는다.
728x90
반응형