[BOJ] 14499 주사위 굴리기 - 삼성SW역량테스트 기출

BOJ 14499 주사위 굴리기

https://www.acmicpc.net/problem/14499

  1. 주사위 도면도를 가로부분, 세로부분 나눠서 생각
  2. 위, 아래를 공유함
  3. 동서남북 방향에 따라 주사위 전개도 업데이트
  • 북쪽이면 세로부분 위로밀고 남쪽이면 아래로 밀고
  • 동쪽이면 가로부분 오른쪽으로 밀고 서쪽이면 왼쪽으로 밀고
  1. 세로, 가로 부분 공유하는 위, 아래 부분 서로 같게 업데이트
  2. 지도가 0일 경우와 아닐 경우 나눠서 지도에 바닥값 복사 or 지도에 있는 값 주사위 바닥에 복사
# BOJ 14499 주사위 굴리기[삼성 SW 역량 테스트 기출] 골드4 - 김수민
from collections import deque
N, M, y, x, K = map(int, input().split())
MAP = [list(map(int, input().split())) for _ in range(N)]
dy = [0, 0, -1, 1]
dx = [1, -1, 0, 0]
dice_garo = deque([0, 0, 0, 0]) # 주사위 전개도 가로 부분
dice_sero = deque([0, 0, 0, 0]) # 주사위 전개도 세로 부분분Q = deque()
order = list(map(int, input().split()))
top = 0
for k in range(K):
    dir = order[k]
    ny = y + dy[dir - 1]
    nx = x + dx[dir - 1]
    if ny < 0 or ny >= N or nx < 0 or nx >= M:
        continue
    y, x = ny, nx
    # 동,서,남,북일 경우 주사위 전개도 변화
    if dir == 1:
        a = dice_garo.pop()
        dice_garo.appendleft(a)
    elif dir == 2:
        a = dice_garo.popleft()
        dice_garo.append(a)
    elif dir == 3:
        a = dice_sero.popleft()
        dice_sero.append(a)
    else:
        a = dice_sero.pop()
        dice_sero.appendleft(a)
    # 가로와 세로가 공유하는 주사위 위, 바닥 동기화
    if dir == 1 or dir == 2:
        top, bottom = dice_garo[1], dice_garo[3]
        dice_sero[1], dice_sero[3] = top, bottom
    else:
        top, bottom = dice_sero[1], dice_sero[3]
        dice_garo[1], dice_garo[3] = top, bottom
    # 지도가 0일 경우와 0이 아닐 경우
    if MAP[ny][nx] == 0:
        MAP[ny][nx] = bottom
    else:
        bottom = MAP[ny][nx]
        MAP[ny][nx] = 0
        dice_garo[3], dice_sero[3] = bottom, bottom
    print(top)

좋은 웹페이지 즐겨찾기