[백준] 14499 : 주사위 굴리기 파이썬

FFTL:)·2021년 8월 24일

문제 - https://www.acmicpc.net/problem/14499

문제를 처음 읽을 때, 조금 막막한 문제였습니다. 다른 풀이를 찾아보며 푸는 방식에 대하여 배우게 되었고 이해하여 풀어내었습니다.

풀이

  • 일단 준비물이 필요합니다. 지도의 상황을 담을 form, 주사위의 상황을 담을 dice, 동서남북 방향을 다뤄줄 dx, dy 방향을 지시해줄 action, 각각의 데이터를 담아놓고 풀이를 시작하였습니다.

  • 일단 action을 순서대로 하나씩 꺼내주며 하나도 남지 않으면 끝나도록 하였습니다.

  • action에서 명령을 꺼내어 해당 방향으로 이동했을 때 지도 바깥으로 이동하게 되는지를 확인하여 지도 밖으로 이동하게 하는 명령일 경우에는 continue로 건너뛰어 줍니다.

  • 지도 밖으로 이동하지 않는 명령이라면 판단을 시작합니다. 각 key 값의 방향별로 이동 했을 때의 주사위 상태로 주사위 값들을 변경 시켜줍니다(이 부분이 가장 중요).

  2
4 1 3
  5
  6

위 주사위 도면을 가지고 주사위를 만든다고 생각하면 바닥이 1, 동쪽벽 3, 서쪽벽 4, 남쪽벽 5, 북쪽벽 2, 천장이 6 으로 위치를 볼 수 있습니다. 이 주사위가 예를들어 동쪽 방향으로 굴렀을 때를 예상해 보면 바닥이 3, 동쪽벽 6, 서쪽벽 1, 남쪽벽 5, 북쪽벽 2, 천장이 4 이렇게 변화하게 됩니다.

  • 위와 같은 방식으로 주사위 값들이 변하도록 만들어 준 뒤, 천장 벽의 수를 출력해 준 뒤 문제 설명에 나온 바닥칸의 동작을 실행해 줍니다.( 지도 바닥이 0일 때에는 주사위 바닥 수를 지도 바닥에 복사, 지도 바닥이 0이 아닐 때에는 지도 바닥 수를 주사위 바닥에 복사해 준 뒤 지도 바닥을 0으로 변환)

  • 이 과정을 action이 끝날 떄 까지 반복하여 풀이 해줍니다.

code

#settings!###
n, m, x, y, k = map(int, input().split());

form = [];
for i in range(n):
    form.append(list(map(int, input().split())));

action = list(map(int, input().split()));

#solution!###
dice = [0,0,0,0,0,0,0]; #주사위의 상태
dx = [0, 0, 0, -1, 1];	#각각 방향으로 움직일때, 주사위의 위치를 변경시켜주는 도구
dy = [0, 1, -1, 0, 0];	#각각 방향으로 움직일때, 주사위의 위치를 변경시켜주는 도구
now_x = x;
now_y = y;
      
while len(action)>0:
    key = action.pop(0);	#이번에 판단할 명령
    nx = dx[key] + now_x;	#이동할 칸 좌표
    ny = dy[key] + now_y;
    
    if n <= nx or m <= ny or nx < 0 or ny < 0: #바깥으로 이동하는 경우 건너 뛰어줍니다.
        continue;
        
    else:
        now_x = nx;
        now_y = ny;
        if key == 1:	#주사위가 동쪽으로 구를 경우
            #주사위가 굴렀을때 값들이 위치하게 될 곳을 예상하여 값을 바꾸어 줍니다.
            dice = [0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]];
            
            #이동한 지도 바닥 값이 0이라면 주사위 바닥 값을 지도 바닥에 복사해 줍니다.
            if form[now_x][now_y] == 0:	
                form[now_x][now_y] = dice[1];
                
            #이동한 지도 바닥 값이 0이 아니라면 지도 바닥 값을 주사위 바닥에 복사해 주고, 지도 바닥 값을 0으로 변경해 줍니다.
            else:	
                dice[1] = form[now_x][now_y];
                form[now_x][now_y] = 0;
                
            #주사위 천장값 출력
            print(dice[6]);
            
        elif key == 2:	#주사위가 서쪽으로 구를 경우
            dice = [0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]];
            if form[now_x][now_y] == 0:
                form[now_x][now_y] = dice[1];
            else:
                dice[1] = form[now_x][now_y];
                form[now_x][now_y] = 0;
            print(dice[6]);
        
        elif key == 3:	#주사위가 북쪽으로 구를 경우
            dice = [0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]];
            if form[now_x][now_y] == 0:
                form[now_x][now_y] = dice[1];
            else:
                dice[1] = form[now_x][now_y];
                form[now_x][now_y] = 0;
            print(dice[6]);
        
        else :	#주사위가 남쪽으로 구를 경우
            dice = [0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]];
            if form[now_x][now_y] == 0:
                form[now_x][now_y] = dice[1];
            else:
                dice[1] = form[now_x][now_y];
                form[now_x][now_y] = 0;
            print(dice[6]);
profile
생각하는 개발자가 되자!

0개의 댓글