<문제출처>
https://www.acmicpc.net/problem/14499
<체크포인트>
시간 | 쉽게해결 | 1시간이내 | 1시간 이상 or 몇 일 걸림 | 솔루션 보고 해결 |
체감 난이도 | 하 | 중 | 상 | 최상 |
이해도 | 완벽히이해 | 다소 헷갈리는 부분있음 | 이해못함 | |
덧붙일 말 |
숫자가 적힌 칸 위에서 주사위를 한칸 씩 굴릴 때마다 주사위 윗방향에 적혀 있는 숫자들을 출력하는 문제
<고민 끄적끄적>
주사위를 두개의 리스트로 표현하였다.
주사위를 상, 하, 좌, 우로 굴릴때마다 기존의 두개의 리스트 번호들이 어떻게 변하는지를 체크해서 굴릴때마다 적힌 값들을 이동해 주었다.
나머지는 문제조건에 맞게 굴리고, 경계조건 확인하고, 숫자 변환하면 끝! 어렵지 않은 문제였다
최종코드
import sys; input = sys.stdin.readline
from collections import deque
n, m, x, y, k = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
cmds = list(map(int, input().split()))
dxs, dys = [None, 0, 0, -1, 1], [None, 1, -1, 0, 0] # 1 ~ 4 동, 서, 북, 남
dice1 = deque([0, 0, 0, 0])
dice2 = deque([0, 0])
def is_range(nx, ny):
return 0 <= nx < n and 0 <= ny < m
for dire in cmds:
nx, ny = x + dxs[dire], y + dys[dire]
if is_range(nx, ny):
# 주사위 위치 변경
if dire == 1: # 우
a, b = dice2[0], dice2[1]
dice2[0], dice2[1] = dice1[2], dice1[0]
dice1[0], dice1[2] = a, b
elif dire == 2: # 좌
a, b = dice2[0], dice2[1]
dice2[0], dice2[1] = dice1[0], dice1[2]
dice1[0], dice1[2] = b, a
elif dire == 3: # 상
dice1.appendleft(dice1.pop())
elif dire == 4: # 하
dice1.append(dice1.popleft())
# 칸의 숫자가 0인경우 주사위 바닥면이 칸에 복사
if arr[nx][ny] == 0:
arr[nx][ny] = dice1[2]
# 칸의 숫자가 0이 아니면 칸의 숫자가 주사위 바닥면으로 복사된다. 그리고 해당 칸은 0
else:
dice1[2] = arr[nx][ny]
arr[nx][ny] = 0
# 윗면 출력
print(dice1[0])
# 현재값 변경
x, y = nx, ny
-> 구현, 시뮬레이션 문제이기때문에 침착만하게 조건 체크하면서 구현하면 된다. 실제 코테에서는 절대 당황해서 실수하지 말것!주의! 틀리면 눈물난다
'algorithm > 백준' 카테고리의 다른 글
[백준-파이썬] 10971(Silver)/백트래킹 : 외판원 순회2 (0) | 2023.02.12 |
---|---|
[백준-파이썬] 4811(Gold5)/DP : 알약 (0) | 2023.02.05 |
[백준-파이썬] 14942(Platinum5)/dfs : 개미 (0) | 2023.02.05 |
[백준-파이썬] 1103(Gold2)/dfs : 게임 (0) | 2023.01.29 |
[백준-파이썬] 3109(Gold2)/dfs : 빵집 (0) | 2023.01.28 |