숭이
[시뮬레이션] 백준 14499번. 주사위 굴리기 | 삼성 SW 역량 테스트 기출 문제 본문
# 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() 함수에서 수행했다.
함수에 대해 이해하기 쉽도록 각 방향으로 주사위를 굴릴 때, 숫자들이 이동하는 방향을 그림으로 그려봤다.
'코딩 테스트' 카테고리의 다른 글
[시뮬레이션] 백준 3190번. 뱀 (파이썬) | 삼성 SW 역량 테스트 기출 문제 (0) | 2024.10.08 |
---|---|
[그래프 탐색] 깊이 우선 탐색을 스택으로 구현하는 세 가지 방법 | 백준 2606번 파이썬 (1) | 2024.04.20 |
[그래프 탐색] 백준 2667번. 단지번호붙이기 (파이썬) | DFS, BFS (0) | 2024.04.11 |
[그래프 탐색] 깊이 우선 탐색 알고리즘이란 (DFS, Depth First Search) | 백준 1260번 (0) | 2024.04.10 |
[그리디 알고리즘] 백준 2457번. 공주님의 정원 (파이썬) (0) | 2024.03.31 |