(전공복습) 데이터과학 4. 시각화
차례
간단한 시뮬레이션 구현 문제.
까다로운 부분은 주사위가 굴러감에 따라서 윗면과 바닥면의 위치가 바뀌는 부분인데, 그냥 하드코딩해도 충분하다.
임의로 dice[0]
부터 dice[5]
를 각각 원래 상태의 윗면, 북쪽 면, 바닥면, 남쪽 면, 서쪽 면, 동쪽 면으로 정했다.
주사위(정확히는 주사위가 없어서 네모난 지우개)를 돌려 가면서 각 면이 어떤 면으로 변하는지 확인해보면 된다.
그 다음에는 지시사항을 따르면 충분하다.
#!python
n, m, x, y, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
command = list(map(int, input().split()))
# direction[i]는 커맨드가 i일 때 이동해야 하는 (x값, y값, (주사위 값 튜플))
# 예를 들어 direction[4][2][0]은 방향이 4(남쪽)일 때 주사위의 0번 면에 1번의 값이 들어가는 것을 의미한다.
direction = ((0, 0, 0), (0, 1, (4, 1, 5, 3, 2, 0)), (0, -1, (5, 1, 4, 3, 0, 2)), (-1, 0, (3, 0, 1, 2, 4, 5)), (1, 0, (1, 2, 3, 0, 4, 5)))
dice = [0 for _ in range(6)]
for c in command:
dx, dy, dd = direction[c]
# 범위를 넘어가는 경우 아무 값도 바꾸거나 출력하지 않고 넘어감
if not (0 <= x + dx < n and 0 <= y + dy < m):
continue
# 주사위 돌리기
# 임시 변수를 만들어 새로운 주사위의 상태를 저장한 후 옮긴다
temp = [0 for _ in range(6)]
for i in range(6):
temp[i] = dice[dd[i]]
dice = temp[:]
# 밑면 숫자 / 보드 숫자 바꾸기
# 이후 이동에서는 갱신된 x, y값을 기준으로 해야 하므로 값을 갱신한다
# dice[2]는 주사위의 바닥면을 의미한다
x, y = x + dx, y + dy
if board[x][y] == 0:
board[x][y] = dice[2]
else:
dice[2] = board[x][y]
board[x][y] = 0
# 윗면 출력
print(dice[0])
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...