[ BOJ / Python ] 14499번 주사위 굴리기

황승환·2022년 3월 6일
0

Python

목록 보기
229/498


이번 문제에서는 주사위의 전개도가 매우 중요했다. 주사위에 새겨지는 수를 리스트로 관리하고, 각 방향으로 주사위가 돌아갈 때에 인덱스 1은 항상 위, 인덱스 6은 항상 아래로 향하도록 하고 방향에 따라서 값들을 회전시켜주었다. 이 과정은 당연히 주사위의 다음 위치가 그래프 범위 내에 들어가 있을 때에만 실행되도록 하였다.

  • n, m, y, x, k를 입력받는다.
  • 그래프를 입력받을 리스트 graph를 선언한다.
  • n번 반복하며 graph를 입력받는다.
  • 이동 명령어들을 commands에 입력받는다.
  • 주사위에 새겨지는 값들을 관리할 리스트 dice를 0 7개로 채운다.
  • 1, 2, 3, 4에 해당하는 이동을 dy, dx에 저장한다. 이때 1에 해당하는 이동은 dy[1], dx[1]에 저장되고, 2에 해당하는 이동은 dy[2], dx[2]에 저장되도록 하였다.
  • 주사위의 눈금 회전을 구현할 함수 move를 dir을 인자로 갖도록 선언한다.
    -> 만약 dir이 1일 경우,
    --> dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]로 갱신한다.
    -> 만약 dir이 2일 경우,
    --> dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]로 갱신한다.
    -> 만약 dir이 3일 경우,
    --> dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]로 갱신한다.
    -> 만약 dir이 4일 경우,
    --> dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]로 갱신한다.
  • 이동할 인덱스를 저장할 ny, nx 변수를 y, x로 선언한다.
  • commands를 순회하는 i에 대한 for문을 돌린다.
    -> ny에 dy[i]를 더한다.
    -> nx에 dx[i]를 더한다.
    -> 만약 ny가 0이상, n미만이고, nx가 0이상, m미만일 경우,
    --> move(i)를 호출한다.
    --> 만약 graph[ny][nx]가 0일 경우,
    ---> graph[ny][nx]dice[-1]로 갱신한다.
    --> 만약 graph[ny][nx]가 0보다 클 경우,
    ---> dice[-1]graph[ny][nx]로 갱신한다.
    ---> graph[ny][nx]를 0으로 갱신한다.
    --> dice[1]을 출력한다.
    -> 그 외의 경우,
    --> ny에서 dy[i]를 뺀다.
    --> nx에서 dx[i]를 뺀다.

Code

n, m, y, x, k=map(int,input().split())
graph=[]
for _ in range(n):
    graph.append(list(map(int, input().split())))
commands=list(map(int, input().split()))
dice=[0 for _ in range(7)]
dy=[0, 0, 0, -1, 1]
dx=[0, 1, -1, 0, 0]
def move(dir):
    if dir==1:
        dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]=dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]
    elif dir==2:
        dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]=dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]
    elif dir==3:
        dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]=dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]
    elif dir==4:
        dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]=dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]
ny, nx=y, x
for i in commands:
    ny+=dy[i]
    nx+=dx[i]
    if 0<=ny<n and 0<=nx<m:
        move(i)
        if graph[ny][nx]==0:
            graph[ny][nx]=dice[-1]
        elif graph[ny][nx]>0:
            dice[-1]=graph[ny][nx]
            graph[ny][nx]=0
        print(dice[1])
    else:
        ny-=dy[i]
        nx-=dx[i]

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글