본문 바로가기
알고리즘 풀이/백준

[백준 14499] 주사위 굴리기(python)

by char_lie 2023. 4. 22.
반응형

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

주사위 굴리기 문제

주사위를 굴려서 바닥의 숫자가 0이면 주사위 바닥면의 숫자를 바닥에, 바닥의 숫자가 0이 아니면 주사위 바닥면의 숫자를 바닥의 숫자로 바꾸고 바닥의 숫자를 0으로 바꿔가는 것을 반복했을 때 주사위 상단에 쓰여있는 수를 구하는 문제

조건 나눠서 구현하는 문제였다.

📌 문제 접근 포인트

※ 그림으로 보는 주사위

도면의 전개도의 주사위 형태

1. 주사위를 동쪽으로 굴릴 경우

[1,2,3,4,5,6]의 위치 변경 → [4, 2, 1, 6, 5, 3]

 

2. 주사위를 서쪽으로 굴릴 경우

[1,2,3,4,5,6]의 위치 변경 → [3, 2, 6, 1, 5, 4]

 

3. 주사위를 북쪽으로 굴릴 경우

[1,2,3,4,5,6]의 위치 변경 → [5, 1, 3, 4, 6, 2]

 

4. 주사위를 남쪽으로 굴릴 경우

[1,2,3,4,5,6]의 위치 변경 → [2, 6, 3, 4, 1, 5]

1. 주어진 도면의 주사위를 생각해 보자. 주사위 각 면에 해당하는 위치를 [1, 2, 3, 4, 5, 6]이라고 생각하고 진행해 보자.
2. 각각의 주사위를 굴릴 경우 숫자의 방향은 위의 그림과 같이 바뀌게 된다. 이 점을 고려해서 위치가 바뀔 수 있게 만들어주자
3. 시작 주사위의 경우 각 위치에 해당하는 값이 [0,0,0,0,0,0]이고, 각 값을 받을 때마다 위 2번을 반복할 수 있게 코드를 구성하자
4. 나머지 간단한 조건에 대해서 구현하고 횟수 반복하면 구현 완료.

⚙ 내가 푼 정답코드

# 조건 0 : 맵밖으로 나가면 동작 x
# 조건 1 : 지도위에 윗면 1, 동쪽 3인 상태로 놓여있음 
# 조건 2 : 가장 처음 주사위에는 모든 면 0
# 조건 3 : 주사위를 굴렸을 때 이동한 칸에 쓰인 수가 0이면 주사위 바닥면에 있는 수가 칸에 복사
# 조건 4 : 0이 아니면 칸에 쓰인 수가 주사위 바닥면에 복사되면서 칸에 쓰인 수는 0
def roll(move): # 조건 1을 기준으로 굴리기
    if move == 1: # 동쪽으로 굴리면
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[3], dice[1], dice[0], dice[5], dice[4], dice[2] # 주사위 변화 4 2 1 6 5 3
    elif move == 2: # 서쪽으로 굴리면
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[2], dice[1], dice[5], dice[0], dice[4], dice[3] # 주사위 변화 3 2 6 1 5 4
    elif move == 3: # 북쪽으로 굴리면
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[4], dice[0], dice[2], dice[3], dice[5], dice[1] # 주사위 변화 5 1 3 4 6 2
    elif move == 4: # 남쪽으로 굴리면
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[1], dice[5], dice[2], dice[3], dice[0], dice[4] # 주사위 변화 2 6 3 4 1 5

import sys
N, M, y, x, K = map(int, sys.stdin.readline().split())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
dice_move = list(map(int, sys.stdin.readline().split()))
dice = [0, 0, 0, 0, 0, 0] # 조건 2
dy = [0, 0, -1, 1] 
dx = [1, -1, 0, 0]

for i in dice_move:
    if 0 <= y + dy[i-1] < N and 0 <= x + dx[i-1] < M: # 조건 0
        y = y + dy[i-1]
        x = x + dx[i-1]
        roll(i)
        if board[y][x] == 0: # 조건 3
            board[y][x] = dice[5]
        else : # 조건 4
            dice[5] = board[y][x]
            board[y][x] = 0
        print(dice[0])

 

반응형

댓글