Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

숭이

[시뮬레이션] 백준 14499번. 주사위 굴리기 | 삼성 SW 역량 테스트 기출 문제 본문

코딩 테스트

[시뮬레이션] 백준 14499번. 주사위 굴리기 | 삼성 SW 역량 테스트 기출 문제

soonge2 2024. 10. 8. 17:49

# Question

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

 

# Solution

## code

# 백준 14499 주사위 굴리기
import sys
input = sys.stdin.readline


def rotate_dice(_c, _dice):
    if _c == 4:  # 남쪽
        # 전개도 세로줄 숫자들을 아래 방향으로 한 칸씩 옮긴다
        tmp = _dice[3][1]
        _dice[3][1] = _dice[2][1]  # 밑 <= 앞 (앞면에 적힌 숫자를 밑면으로 이동)
        _dice[2][1] = _dice[1][1]  # 앞 <= 위
        _dice[1][1] = _dice[0][1]  # 위 <= 뒤
        _dice[0][1] = tmp         # 뒤 <= 밑
        # 좌, 우는 그대로
    elif _c == 3:  # 북쪽
        # 전개도 세로줄 숫자들을 위 방향으로 한 칸씩 옮긴다
        tmp = _dice[0][1]
        _dice[0][1] = _dice[1][1]  # 뒤 <= 위
        _dice[1][1] = _dice[2][1]  # 위 <= 앞
        _dice[2][1] = _dice[3][1]  # 앞 <= 밑
        _dice[3][1] = tmp         # 밑 <= 뒤
        # 좌, 우는 그대로
    elif _c == 2:  # 서쪽
        tmp = dice[3][1]
        _dice[3][1] = _dice[1][0]  # 밑 <= 좌
        _dice[1][0] = _dice[1][1]  # 좌 <= 위
        _dice[1][1] = _dice[1][2]  # 위 <= 우
        _dice[1][2] = tmp         # 우 <= 밑
        # 앞, 뒤는 그대로
    else:  # 동쪽
        tmp = _dice[1][0]
        _dice[1][0] = _dice[3][1]  # 좌 <= 밑
        _dice[3][1] = _dice[1][2]  # 밑 <= 우
        _dice[1][2] = _dice[1][1]  # 우 <= 위
        _dice[1][1] = tmp         # 위 <= 좌
        # 앞, 뒤는 그대로

    return _dice


N, M, x, y, K = map(int, input().split())
board = []
for i in range(0, N):
    board.append(list(map(int, input().split())))
command = list(map(int, input().split()))


dice = [[-1, 0, -1],    # - 뒤 -
        [0, 0, 0],      # 좌 위 우
        [-1, 0, -1],    # - 앞 -
        [-1, 0, -1]]    # - 밑 -
dxdy = [[1, 0], [-1, 0], [0, -1], [0, 1]]  # 동, 서, 북, 남


for c in command:
    # 다음 주사위 좌표 확인
    tmp_x = x + dxdy[c-1][1]  # x가 세로
    tmp_y = y + dxdy[c-1][0]  # y가 가로
    if tmp_x >= N or tmp_x < 0 or tmp_y >= M or tmp_y < 0:  # 바깥으로 이동하는 경우 무시
        continue
    else:
        x, y = tmp_x, tmp_y

    # 주사위 전개도 변경
    dice = rotate_dice(c, dice)

    # 보드와 주사위 위 숫자 변경
    num_board = board[x][y]
    if num_board == 0:
        board[x][y] = dice[3][1]  # 주사위 바닥면의 수를 보드에 복사
    else:
        dice[3][1] = board[x][y]  # 보드의 수를 주사위 바닥면에 복사
        board[x][y] = 0

    # 주사위 윗면의 수 출력
    print(dice[1][1])

 

## explanation

Flow:

주사위를 굴리는 각 시행마다

1. 다음 주사위의 위치(보드 위 좌표) 확인

2. 주사위 이동에 따라 전개도 위 숫자 변경

3. 보드에 적힌 숫자에 따라 보드와 주사위 바닥면의 숫자 변경

4. 주사위 윗면의 숫자 출력

 

포인트:

- 보드와 전개도를 각각 2차원 배열로 정의해서 사용. 보드와 전개도에 적힌 숫자들을 저장한다. ★

- (Flow 2번 추가설명) 전개도 배열은 면들의 위치를 고정시킨 다음 숫자를 변경하는 방식으로 사용한다. (주사위를 굴리고 나면, 각 면을 나타내는 위치에 숫자를 바꾸어준다.) ★★

문제 설명에 따라 아래와 같이 고정했다!

 

 

전개도 위 숫자 변경은 rotate_dice() 함수에서 수행했다. 

함수에 대해 이해하기 쉽도록 각 방향으로 주사위를 굴릴 때, 숫자들이 이동하는 방향을 그림으로 그려봤다.