백준14499(파이썬) - 주사위 굴리기

resilient

·

2021. 5. 25. 11:27

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개의 줄에 지도

www.acmicpc.net

  • 이런 문제는 문제를 잘 읽고 앞에서 부터 문제에서 하라는 대로 차근차근 구현해야 하는 문제이다.
  • 먼저 주사위를 움직일때 처리를 해주고, 좌표로 봤을 때 범위에 대한 제한이 있으므로 x,y까지 고려해준다.
  • 아래는 친구가 풀었던 풀이인데 주사위위치가 변화할 때 함수로 만들어서 접근하였다. 나는 그냥 dice에 갱신해주면서 문제가 풀렸기 때문에 newRect를 만든 이유는 한번 물어봐야겠다. 
  • nx,ny를 어떻게 쓸지 생각하는게 까다로웠다.
import sys
input = sys.stdin.readline

dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]


n, m, x, y, k = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
order = list(map(int, input().split()))
dice = [0,0,0,0,0,0]

for i in range(k):
    way = order[i] - 1
    nx = x + dx[way]
    ny = y + dy[way]
    if not 0 <= nx < n or not 0 <= ny < m:
        continue

    if way == 0:
        dice[0], dice[2], dice[3], dice[5] = dice[3], dice[0], dice[5], dice[2]
    elif way == 1:
        dice[0], dice[2], dice[3], dice[5] = dice[2], dice[5], dice[0], dice[3]
    elif way == 2:
        dice[0], dice[1], dice[4], dice[5] = dice[4], dice[0], dice[5], dice[1]
    elif way == 3:
        dice[0], dice[1], dice[4], dice[5] = dice[1], dice[5], dice[0], dice[4]

    if graph[nx][ny] == 0:
        graph[nx][ny] = dice[5]
    else:
        dice[5] = graph[nx][ny]
        graph[nx][ny] = 0

    x, y = nx, ny
    print(dice[0])

아래는 친구가 작성한 코드이다.

import sys
input = sys.stdin.readline

n, m, x, y, k = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, sys.stdin.readline().split())))

dice = [0,0,0,0,0,0]
order = list(map(int, sys.stdin.readline().split()))

def east(dice): 
    new_dice = [0,0,0,0,0,0]
    new_dice[0] = dice[3]
    new_dice[1] = dice[1]
    new_dice[2] = dice[0]
    new_dice[3] = dice[5]
    new_dice[4] = dice[4]
    new_dice[5] = dice[2]
    return new_dice
def west(dice):   
    new_dice = [0,0,0,0,0,0]
    new_dice[0] = dice[2]
    new_dice[1] = dice[1]
    new_dice[2] = dice[5]
    new_dice[3] = dice[0]
    new_dice[4] = dice[4]
    new_dice[5] = dice[3]
    return new_dice
def north(dice):   
    new_dice = [0,0,0,0,0,0]
    new_dice[0] = dice[4]
    new_dice[1] = dice[0]
    new_dice[2] = dice[2]
    new_dice[3] = dice[3]
    new_dice[4] = dice[5]
    new_dice[5] = dice[1]
    return new_dice
def south(dice):  
    new_dice = [0,0,0,0,0,0]
    new_dice[0] = dice[1]
    new_dice[1] = dice[5]
    new_dice[4] = dice[0]
    new_dice[5] = dice[4]
    new_dice[2] = dice[2]
    new_dice[3] = dice[3]
    return new_dice


# k번만큼 명령 수행
for i in order:
    if i == 1:      # 동쪽
        if y+1 < m:
            dice = east(dice)
            if graph[x][y+1] == 0:
                graph[x][y+1] = dice[5]
            else:
                dice[5] = graph[x][y+1]
                graph[x][y+1] = 0
            y += 1
            print(dice[0])

    elif i == 2:    # 서쪽
        if y-1 >= 0:
            dice = west(dice)
            if graph[x][y-1] == 0:
                graph[x][y-1] = dice[5]
            else:
                dice[5] = graph[x][y-1]
                graph[x][y-1] = 0
            y -= 1
            print(dice[0])

    elif i == 3:    # 북쪽
        if x-1 >= 0:
            dice = north(dice)
            if graph[x-1][y] == 0:
                graph[x-1][y] = dice[5]
            else: 
                dice[5] = graph[x-1][y]
                graph[x-1][y] = 0
            x -= 1
            print(dice[0])


        elif i == 4:    # 남쪽
            if x+1 < n:
                dice = south(dice)
                if graph[x+1][y] == 0:
                    graph[x+1][y] = dice[5]
                else:
                    dice[5] = graph[x+1][y]
                    graph[x+1][y] = 0
                x += 1
                print(dice[0]) 
반응형