https://www.acmicpc.net/problem/14499
문제 해석
문제를 이해하는 좀 애먹었다. 일단 주사위 전개도의 숫자는 위, 동, 서, 남, 북, 아래가 각각 1, 3, 4, 5, 2, 6을 의미한다.
이를 기억하고, 초기의 주사위의 모든면은 0의 값을 가지고 있다.
주사위는 동서남북으로 굴러갈 수 있다. 굴러간 뒤엔 해당 위치의 쓰여 있는 수가 0이면 주사위의 바닥면에 쓰여있는 수가 칸에 복사되고, 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면에 복사되고, 칸에 쓰여 있는 수는 0이된다.
이후 이동 명령을 주었을 때 이동시 마다 주사위의 위에 적힌 수를 출력하면 된다.
이때 이동할 수 없는 경우라면 아무일도 하지 않는다.
코드
n, m, x, y, k = map(int, input().split())
arr = []
dice = [0, 0, 0, 0, 0, 0] # 위 동 서 남 북 아래
for _ in range(n):
arr.append(list(map(int, input().split())))
do = list(map(int, input().split()))
def turn(i):
over, right, left, down, up, under = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if i == 1: # 동
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = left, over, under, down, up, right
elif i == 2: #서
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = right, under, over, down, up, left
elif i == 3: # 북
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = down, right, left, under, over, up
elif i == 4: # 남
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = up, right, left, over, under, down
def punch(i, j):
if arr[i][j] == 0:
arr[i][j] = dice[5]
else:
dice[5] = arr[i][j]
arr[i][j] = 0
print(dice[0])
for doing in range(k):
if do[doing] == 1: # 동쪽
if 0 <= y + 1 < m:
y += 1
turn(1)
punch(x, y)
elif do[doing] == 4: # 남쪽
if 0 <= x + 1 < n:
x += 1
turn(4)
punch(x, y)
elif do[doing] == 3: # 북쪽
if 0 <= x - 1 < n:
x -= 1
turn(3)
punch(x, y)
elif do[doing] == 2: # 서쪽
if 0 <= y - 1 < m:
y -= 1
turn(2)
punch(x, y)
문제 풀이
먼저 이 문제의 핵심은 동서남북으로 이동시 각 주사위의 면이 어떻게 이동하는지 규칙을 찾는것이다. 정육면체의 그림을 그리고 위 동 서 남 북 아래 를 직접 적어 동쪽으로 굴러갈때, 서쪽으로 굴러갈때 .. 를 직접 해보면서 초기의 위치에서 어떻게 변화하는지 규칙을 찾아야한다.
해당 규칙을 찾고 코드로 적어 놓은것이 turn 함수이다.
이후 주사위 아랫면과 바닥면에 따라 숫자가 변하는 것은 문제를 잘 읽고 구현하면된다.
이는 turn 함수를 통해 구현해주었다.
처음에는 주사위 전개도의 가로축, 세로축을 나누어 굴러갈 때마다 기준점을 변경하는 방식으로 구현하려 했다.
한시간 정도 삽질했지만 도저히 풀리지 않았다. 다시 처음부터 펜을 잡고 그려가며 규칙을 만드는 생각을 했고, 해당 방식으로 구현에 성공했다. 이뿐만 아니라 여기서 주어진 x와 y이 각각 행과 열이라는 사실에 주의하며 구현해야한다.
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ/python] 1149번 RGB거리 (0) | 2022.07.08 |
---|---|
[BOJ/python] 14890번 경사로 (0) | 2022.07.01 |
[BOJ/python] 13911번 집 구하기 (0) | 2022.05.19 |
[BOJ/python] 14502번 연구소 (0) | 2022.05.13 |
[BOJ/python] 11286번 절댓값 힙 (0) | 2022.05.09 |