티스토리 뷰

알고리즘/BOJ

[BOJ-14499] 주사위 굴리기

개발하는 후딘 2020. 3. 21. 03:08
728x90
반응형

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net


[풀이]

처음에 읭? 이게 무슨말이지? 이해가 안갔다.

침착하게 문제를 다시 읽어봤다.

일단 출력은 주사위 윗면에 쓰여진 숫자다.

 

그리고 처음 주사위가 놓인 위치 입력에서 주의하길 바란다.

지도의 좌표(r,c)로 나타내며

r은 북쪽으로 떨어진 칸의 개수: y

c는 서쪽으로 떨어진 칸의 개수: x

주사위가 놓여져 있는 곳의 좌표는 (x,y)인데

입력 순서를 x,y로 하면 안되고 y,x로 해야 한다.

 

가장 처음에 주사위에는 모든 면에 0이 적혀있다.

 

 

두 가지를 짚어보겠다.

(1) 주사위를 동/서/남/북 방향으로 굴릴때, 6개의 주사위면에 쓰여진 수의 변화

(2) 주사위를 굴린 후, 지도의 위치값(MAP[nowy][nowx])

   (2-1) 굴린후 지도의 위치값이 0일 때

   (2-2) 굴린후 지도의 위치값이 0이 아닐 때


(1) 주사위를 동/서/남/북 방햐응로 굴릴때, 6개의 주사위 면에 쓰여진 수의 변화

 

 

[동쪽방향으로 굴렸을 때]

 

[서쪽방향으로 굴렸을 때]

 

[남쪽방향으로 굴렸을 때]

 

[북쪽방향으로 굴렸을 때]


(2) 주사위를 굴린 후, 지도의 위치값(MAP[nowy][nowx])

   (2-1) 굴린후 지도의 위치값이 0일 때

      주사위 바닥면에 쓰여있는 수가 칸에 복사된다.

 

      위의 그림 표를 DICE라는 배열로하면 바닥면에 해당하는 인덱스번호는 5번이다.

      MAP[nowy][nowx]=DICE[5]

      

   (2-2) 굴린후 지도의 위치값이 0이 아닐 때

     칸에 쓰여 있는 수가 주사위 바닥면으로 복사되며

     칸에 쓰여있는 수는 0이 된다.

     DICE[5]=MAP[nowy][nowx]

     MAP[nowy][nowx]=0

 

그리고 주의해야되는게 지도밖을 벗어날때는 주사위 윗면에 있는 수를 출력하지 않도록해야한다!

그래서 다음으로 굴렸을때 주사위의 위치가 지도밖에 벗어나지 않는지를 확인을 한뒤에

위의 (1)과 (2)를 실행 후, 주사위의 윗면에 쓰여있는 수를 출력한다!


[코드]

import sys
from copy import deepcopy
input=sys.stdin.readline

#N: 지도 세로크기, M:지도 가로크기
#y: 북쪽으로부터 떨어져있는 칸의 수
#x: 서쪽으로부터 떨어져있는 칸의 수
# K: 명령의 개수
N,M,y,x,K=map(int, input().strip().split())

#지도
MAP=[]
for _ in range(N):
    MAP.append([*map(int, input().strip().split())])

#명령
# 동:1/ 서:2/ 북:3/ 남:4
ORDER=[*map(int, input().strip().split())]
dy=[0,0,-1,1]
dx=[1,-1,0,0]

#윗면:0, 북쪽방향:1, 동쪽방향:2, 서쪽방향:3, 남쪽방향:4, 바닥면:5
DICE=[0]*6

def isRange(y,x):
    if (y>=0 and y<N) and (x>=0 and x<M):
        return True
    return False

def roll(order):
    tmp=deepcopy(DICE)
    if order==1: #동쪽으로 굴린다. (남북은 그대로)
        tmp[0]=DICE[3]
        tmp[2]=DICE[0]
        tmp[3]=DICE[5]
        tmp[5]=DICE[2]
        
    elif order==2:#서쪽으로 굴린다.(남북은 그대로)
        tmp[0]=DICE[2]
        tmp[2]=DICE[5]
        tmp[3]=DICE[0]
        tmp[5]=DICE[3]
    
    elif order==3: #북쪽으로 굴린다.(동서는 그대로)
        tmp[0]=DICE[4]
        tmp[1]=DICE[0]
        tmp[4]=DICE[5]
        tmp[5]=DICE[1]
        
    else:#남쪽으로 굴린다.(동서는 그대로)
        tmp[0]=DICE[1]
        tmp[1]=DICE[5]
        tmp[4]=DICE[0]
        tmp[5]=DICE[4]
    return tmp
    

#주사위의 위치
nowy, nowx= y,x
upper=DICE[0]
for i in range(K):
    nexty=nowy+dy[ORDER[i]-1]
    nextx=nowx+dx[ORDER[i]-1]
    #주사위의 (지도에서의) 위치가 적절한가?
    if isRange(nexty, nextx):
        nowy=nexty
        nowx=nextx
        
        #주사위를 굴린다.
        DICE=roll(ORDER[i])
        
        #이동한 칸에 쓰여있는 수가 0인가?
        if MAP[nowy][nowx]==0:
            #주사위 바닥면에 쓰여있는 수가 칸에 복사된다.
            MAP[nowy][nowx]=DICE[5]
        #이동한 칸에 쓰여있는 수가 0이 아니라면
        else:
            #칸에 쓰여있는 수가 주사위 바닥면으로 복사되고
            #칸에 쓰여있는 수는 0이된다.
            DICE[5]=MAP[nowy][nowx]
            MAP[nowy][nowx]=0
        #주사위 윗면에 쓰여있는 수를 출력한다.
        print(DICE[0])


728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-14891] 톱니바퀴  (0) 2020.03.24
[BOJ-14500] 테트로미노  (0) 2020.03.21
[BOJ-16234] 인구이동  (0) 2020.03.18
[BOJ-1062] 가르침  (0) 2020.03.18
[BOJ-1966] 프린터 큐  (0) 2020.03.17
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함