반응형
https://www.acmicpc.net/problem/14499
문제 설명
문제에서 맵이 주어지고 맵의 첫 칸(0, 0)에 주사위를 놓는다.
그리고 주사위를 상, 하, 좌, 우 로 굴리게 되는데 주사위와 바닥에 닿는 면은 맵의 숫자로 복사가 된다.
그리고 주사위를 굴렸을 때 주사위 위쪽면의 숫자를 출력해야 한다.
따라서, 주사위 전개도를 생각하며 풀어야 하는 문제이다.
풀이 과정
이 문제를 풀기 위해 주사위 전개도를 직접 그려보면서 생각을 했다.
문제에서 주어진 주사위 전개도를 보면 다음과 같이 생겼는데
1을 위쪽으로 6을 아래쪽으로 접게되면 다음과 같은 주사위가 탄생한다.
그리고 이 주사위를 상, 하, 좌, 우로 굴렸을 때의 모양을 생각해야 한다.
대표적으로, 좌 로 굴렸을 때의 주사위는 다음과 같다.
이 때 주사위가 어떻게 변했는지 보자.
인덱스 0부터 5까지 각각의 인덱스가 위쪽, 뒤쪽, 오른쪽, 왼쪽, 앞쪽, 바닥 이라고 했을 때
[1, 2, 3, 4, 5, 6] => [3, 2, 6, 1, 5, 4] 로 변했음을 알 수 있다.
마찬가지로 다른 방향으로 굴렸을 때에 대해서도 어떻게 변했는지를 알면 이 문제를 다 풀었다고 볼 수 있다.
이러한 규칙을 turn함수에 정의를 해놓고
굴려야 하는 타이밍에 함수를 실행시키면 된다.
나머지부분은 문제에서 주어진 대로 구현만 하면 된다.
이를 파이썬으로 나타낸 코드는 다음과 같다.
n, m, x, y, k = map(int, input().split())
board = []
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
dice = [0, 0, 0, 0, 0, 0]
def turn(dir):
a, b, c, d, e, f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 1: #동
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d, b, a, f, e, c
elif dir == 2: #서
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = c, b, f, a, e, d
elif dir == 3: #북
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, a, c, d, f, b
else:
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b, f, c, d, a, e
for i in range(n):
board.append(list(map(int, input().split())))
comm = list(map(int, input().split()))
nx, ny = x, y
for i in comm:
nx += dx[i-1]
ny += dy[i-1]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
nx -= dx[i-1]
ny -= dy[i-1]
continue
turn(i)
if board[nx][ny] == 0:
board[nx][ny] = dice[-1]
else:
dice[-1] = board[nx][ny]
board[nx][ny] = 0
print(dice[0])
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
반응형
'Algorithm > Implementation' 카테고리의 다른 글
[백준] 14503 로봇 청소기 (Python 파이썬) (0) | 2021.10.19 |
---|---|
[백준] 14500 테트로미노 (Python 파이썬) (0) | 2021.10.16 |
[백준] 18870 좌표 압축 (Python 파이썬) (0) | 2021.10.02 |
[백준] 2108 통계학 (Python 파이썬) (0) | 2021.10.02 |
[백준] 1002 터렛 (Python 파이썬) (0) | 2021.10.02 |