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
<문제 요약>
- N * M 지도에 한칸에 하나씩 0 - 9 숫자가 써있다. 처음 주사위의 위치 x, y와 이동 명령 수 k 가 입력으로 주어짐
- 주사위 전개도에서 1이 윗면, 3이 동쪽을 바라보는 상태로 놓여있고, 가장 처음 주사위의 모든 면에 0이 적혀있음
- 명령으로 주어진 방향으로 주사위를 굴리면서 한칸씩 이동 해야함
- 주사위가 이동하는 칸이 0이면 그 칸에 주사위의 바닥면에 쓰여 있는 수가 복사됨.
- 주사위가 이동하는 칸이 0이 아니면 칸에 쓰여있는 수가 주사위 바닥면으로 복사되고, 그 칸은 0이 됨
- 이 때 지도 범위를 벗어나서 이동하려는 경우에는 명령을 무시함
- 명령은 1:동쪽, 2:서쪽, 3:북쪽, 4:남쪽으로 주어짐
<주사위 설명>
- 문제에서 요구하는대로 주사위를 접으면 우측 입체도와 같다.
- 여기서 방향은 바라보고 있는 방향
- 주사위 전개도를 1차원 리스트로 변경시키고, 1-6번까지 초기 주사위 리스트를 기준으로 회전 했을 때 변화
- 이동 방향이 주어지고 그 방향으로 주사위를 굴리면 해당면은 바닥으로 가고 상태가 변한다.
- 머릿 속으로 차근차근 생각해볼것,,, 도형 시러 ㅠ
<내 코드>
- rolling_dice(d) 함수 : 이동 방향을 입력으로 받아서 주사위 상태를 그 방향으로 굴렸을 때로 변화시킴
- 위 주사위 1차원 리스트를 참고해서 위치를 변경했다.
- 이동 명령 수행
- 이동 방향으로 nx, ny를 설정한다.
- 이 때, 범위를 벗어나지 않는 경우 rolling_dice 함수를 호출해서 주사위 상태를 변화 시킨다.
- 만약 이동할 칸이 0이면 이동할 칸에 주사위 바닥면을 복사한다.
- 그렇지 않은 경우, 해당 칸의 숫자를 주사위 바닥면에 대입하고, 해당 칸은 0이 된다.
- 이동한 경우에 주사위 윗면 출력, x, y를 현재 위치로 업데이트한다.
import sys
import copy
input = sys.stdin.readline
n, m, x, y, k = map(int , input().split())
maps = []
for _ in range(n):
maps.append(list(map(int, input().split())))
orders = list(map(int, input().split()))
# 동, 서, 북, 남 순서
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
dice = [0]*6 #주사위 상태 나타내는 리스트
def rolling_dice(d):
temp = copy.deepcopy(dice)
if d == 1: # 동쪽으로 굴렸을 때
# 주사위 상태 변경
dice[0] = temp[3]
dice[2] = temp[0]
dice[3] = temp[5]
dice[5] = temp[2]
elif d == 2: # 서쪽으로 굴렸을 때
# 주사위 상태 변경
dice[0] = temp[2]
dice[2] = temp[5]
dice[3] = temp[0]
dice[5] = temp[3]
elif d == 3: # 북쪽으로 굴렸을 때
dice[0] = temp[4]
dice[1] = temp[0]
dice[4] = temp[5]
dice[5] = temp[1]
else: # 남쪽으로 굴렸을 때
dice[0] = temp[1]
dice[1] = temp[5]
dice[4] = temp[0]
dice[5] = temp[4]
for d in orders:
nx = x + dx[d-1]
ny = y + dy[d-1]
if 0<=nx<n and 0<=ny<m: # 범위 체크
rolling_dice(d)
if maps[nx][ny] == 0: # 지도의 칸이 0이면 주사위 바닥면 복사
maps[nx][ny] = dice[5] #주사위 바닥면
else:
dice[5] = maps[nx][ny]
maps[nx][ny] = 0 #칸에 쓰인 숫자 0됨
print(dice[0]) # 이동 후 주사위 윗면 출력
x, y = nx, ny # 이동한 경우에만 현재 위치 x, y 업데이트
'알고리즘 > 삼성' 카테고리의 다른 글
[백준-골드3] 19238번 스타트 택시(BFS, 구현, 파이썬) (0) | 2022.04.15 |
---|---|
[백준-골드3] 23228번 주사위 굴리기2 (구현, BFS, 파이썬) (0) | 2022.04.13 |
[백준-골드1] 21611번 마법사 상어와 블리자드 (구현, pypy3) (0) | 2022.04.11 |
[백준-실버1] 21608번 상어 초등학교(구현, 파이썬) (0) | 2022.04.04 |
[백준-골드2] 21609번 상어 중학교(BFS, 구현, 파이썬) (0) | 2022.04.04 |