확실히 프론트 관련 프로그래밍을 하니까 시뮬레이션 문제가 잘 풀리는 것 같다.
동작 단위로 나눠보는 프로세스를 그래도 계속 거쳤기 때문이지 않을까 싶었다.
해당 문제에서는 자료 저장 파트와 동작 파트가 타 문제에 비해 더 쉽게 구분된다.
-자료 저장 파트
1. 맵의 상태
2. 주사위 상태
-동작 파트
주사위 굴리기
: 주사위 상태 변화
: 굴리기 이전 동작: 세부적으로 넘어가면, 굴렸을 때 맵 범위를 벗어나는 지 체크
: 굴리고 그 이후 동작: 추가 구현-> 숫자 복사하기 ( 맵 <-> 주사위 )
1. 맵 상태, 주사위 상태는 배열로 저장. 범위가 짧아서 별 생각 없이 리스트 사용.
2. 주사위 굴리기 이전 동작은 평소 하던대로 dx, dy배열 잡고 nx,ny = x+dx[i], y+dy[i]이런 식으로 nx,ny만들어서 범위 체크
3. 주사위 굴리고 이후 동작도 그냥 값 바꾸기로 간단하게 해결
4. ....?? 주사위 굴리는 동작이 약간 으읭? 했다.
이 비슷한 문제 풀어봤던 것 같아서 주사위 상태를 저장할 생각도 했던 것 같은데,
막상 그 주사위 배열로 뭐 어째야하는거지..? 난감해서 이리저리 궁리하다가 그냥 보고 외우자싶어서 검색했다.


https://hongcoding.tistory.com/128
[백준] 14499 주사위 굴리기 (Python 파이썬)
https://www.acmicpc.net/problem/14499 14499번: 주사위 굴리기 첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개..
hongcoding.tistory.com
이 분 설명 덕분에 보자마자 이해할 수 있었다.
그래서 상 하 좌 우에 대해서 하나하나 움직인 모양을 그려가면서 배열 만들었다.
그래서 나온 코드.
import sys
input = sys.stdin.readline
N, M, x, y, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
direction_orders = list(map(int, input().split()))
dice = [0, 0, 0, 0, 0, 0]
def roll(direction):
if direction == 1:
dice[0], dice[2], dice[3], dice[5] = dice[3], dice[0], dice[5], dice[2]
elif direction == 2:
dice[0], dice[2], dice[3], dice[5] = dice[2], dice[5], dice[0], dice[3]
elif direction == 3:
dice[0], dice[1], dice[4], dice[5] = dice[4], dice[0], dice[5], dice[
1],
elif direction == 4:
dice[0], dice[1], dice[4], dice[5] = dice[1], dice[5], dice[0], dice[4]
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
for order in direction_orders:
nx, ny = x + dx[order - 1], y + dy[order - 1]
if 0 <= nx < N and 0 <= ny < M:
roll(order)
if board[nx][ny] == 0:
board[nx][ny] = dice[5]
else:
dice[5] = board[nx][ny]
board[nx][ny] = 0
print(dice[0])
x, y = nx, ny

주사위 굴린 후에 바꾸는 동작은 함수로 뺄까하다가 간단해서 그냥 뒀는데 빼서 의미 담는게 더 나았을까 싶다.
roll에서 js 구조 분해 할당처럼 dice접근을 미리 a,b,c변수에 담는 과정으로 만드신 코드도 보긴 했는데 위에서 의미 말한 것과 마찬가지로 이름 때문에 그냥 배열 접근을 반복하게 냅뒀다. 바꾸는게 더 나은 건가..? 움움..🙄
https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지
www.acmicpc.net
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ /파이썬 ] 11660 구간 합 (0) | 2022.10.06 |
---|---|
[ BOJ / 파이썬 ] 13335 트럭을 지나는 트럭 (0) | 2022.10.05 |
[ BOJ / 파이썬 ] 15665 N과M(11) (0) | 2022.08.30 |
[ BOJ / 파이썬 ] 15664 N과M(10) (0) | 2022.08.30 |
[ BOJ / 파이썬 ] 15657 N과M(9) (*다시 체크 요망, 덜 이해한듯*) (0) | 2022.08.30 |