본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 14499 주사위 굴리기

확실히 프론트 관련 프로그래밍을 하니까 시뮬레이션 문제가 잘 풀리는 것 같다.

동작 단위로 나눠보는 프로세스를 그래도 계속 거쳤기 때문이지 않을까 싶었다. 


해당 문제에서는 자료 저장 파트와 동작 파트가 타 문제에 비해 더 쉽게 구분된다.

-자료 저장 파트

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