728x90
반응형
백준 주사위 굴리기 14499 파이썬(Python) 정답 코드 및 해설입니다.
이 문제에서는 N x M 크기의 지도 위에 주사위가 놓여 있고, 주어진 명령에 따라 주사위를 굴리면서 특정 규칙에 따라 지도의 숫자와 주사위의 숫자를 변경한다.
주사위의 초기 상태와 전개도
주사위의 초기 전개도는 다음과 같다:
2
4 1 3
5
6
- 윗면: 1
- 아랫면: 6
- 앞면: 5
- 뒷면: 2
- 왼쪽 면: 4
- 오른쪽 면: 3
주사위의 모든 면에는 처음에 0이 적혀 있다.
이동 규칙
- 주사위를 이동시킨다.
- 이동 방향은 동쪽(1), 서쪽(2), 북쪽(3), 남쪽(4)이다.
- 주사위를 이동시킬 때 지도의 바깥으로 이동하려고 하면 그 명령은 무시한다.
- 이동한 칸에 쓰여 있는 수에 따라 다음을 수행한다:
- 칸의 수가 0이면: 주사위의 바닥면에 쓰여 있는 수를 칸에 복사한다.
- 칸의 수가 0이 아니면: 칸에 쓰여 있는 수를 주사위의 바닥면에 복사하고, 칸의 수는 0이 된다.
- 각 이동이 끝날 때마다 주사위의 윗면에 쓰여 있는 수를 출력한다.
해결 방법: 시뮬레이션
이 문제는 주사위의 상태와 지도의 상태를 관리하면서 주어진 명령대로 시뮬레이션하면 된다.
구현 단계
- 입력 받기
- 지도의 크기 N, M과 주사위의 초기 위치 x, y, 명령의 개수 K를 입력받는다.
- 지도의 정보를 2차원 리스트 board에 저장한다.
- 명령 리스트 commands를 입력받는다.
- 주사위 상태 관리
- 주사위의 각 면을 관리하기 위해 리스트 dice를 사용한다.
- dice[0]: 윗면
- dice[1]: 아랫면
- dice[2]: 앞면
- dice[3]: 뒷면
- dice[4]: 왼쪽 면
- dice[5]: 오른쪽 면
- 주사위의 각 면을 관리하기 위해 리스트 dice를 사용한다.
- 주사위 굴리기 함수 구현
- 주사위를 굴리는 함수를 만들어 각 명령에 따라 주사위의 면을 회전시킨다.
- 방향에 따라 주사위의 면이 어떻게 변하는지 구현한다.
- 시뮬레이션 실행
- 각 명령에 대해 다음을 수행한다:
- 이동하려는 위치가 지도의 범위를 벗어나면 명령을 무시한다.
- 주사위를 굴리고 위치를 업데이트한다.
- 지도의 칸에 쓰여 있는 수에 따라 주사위와 지도의 값을 변경한다.
- 주사위의 윗면의 값을 출력한다.
- 각 명령에 대해 다음을 수행한다:
최종 정답 코드(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])
핵심 포인트
- 주사위의 면을 리스트로 관리한다: 주사위의 각 면을 리스트의 인덱스로 관리하면 회전 시 면의 값 변경이 편리하다.
- 이동 방향에 따른 면의 변화:
- 동쪽 이동: 윗면, 아랫면, 왼쪽 면, 오른쪽 면이 회전한다.
- 서쪽 이동: 윗면, 아랫면, 왼쪽 면, 오른쪽 면이 반대로 회전한다.
- 북쪽 이동: 윗면, 아랫면, 앞면, 뒷면이 회전한다.
- 남쪽 이동: 윗면, 아랫면, 앞면, 뒷면이 반대로 회전한다.
- 시뮬레이션의 정확한 구현: 주사위의 상태와 지도의 상태를 정확히 업데이트해야 한다.
- 명령의 무시 조건 처리: 지도의 범위를 벗어나는 명령은 반드시 무시하고 출력을 하지 않는다.
728x90
반응형
'Python > 백준' 카테고리의 다른 글
백준 퇴사 [14501] Python 코드 + 해설 (0) | 2024.10.23 |
---|---|
백준 테트로미노 [14500] Python 코드 + 해설 (0) | 2024.10.22 |
백준 시험 감독 [13458] Python 코드 + 해설 (1) | 2024.10.22 |
백준 뱀 [3190] Python 코드 + 해설 (0) | 2024.10.22 |
백준 2048 (Easy) [12100] Python 코드 + 해설 (0) | 2024.10.22 |