백준 14499 주사위 굴리기 삼성SW역량테스트 (Python)

전승재·2023년 7월 26일
0

알고리즘

목록 보기
3/88

백준 14499 주사위 굴리기 바로가기

문제를 보고 두 가지로 나누어서 풀어야겠다고 생각했다.

  • 주사위의 움직임 구현
  • 맵과 주사위 값 비교 및 입력

따라서 우선 주사위의 움직임부터 구현했다.
주사위가 처음에 아래와 같은 리스트 형태로 있다고 가정하자.

[1,2,3,4,5,6] 윗면이 1 동쪽이 3 서쪽이 4 아랫면이 6 북쪽이 2 남쪽이 5

만약 동쪽으로 굴린다면? => 서쪽이 윗면으로 바뀌고 윗면이 동쪽, 동쪽이 아랫면, 아랫면이 서쪽으로 바뀐다. 북, 남은 그대로
[4,2,1,6,5,3]

다른 방향도 위와같이 생각해서 바꿔주면 아래와 같다.

서쪽으로 이동한다면? [3,2,6,1,5,4]
남쪽으로 이동한다면? [2,6,3,4,1,5]
북쪽으로 이동한다면? [5,1,3,4,6,2]

이렇게 굴렸을 때의 dice의 값을 변경해주는 함수를 작성한다.

#[1,2,3,4,5,6] 윗면이 1 동쪽이 3 서쪽이 4 아랫면이 6 북쪽이 2 남쪽이 5
# 만약 동쪽으로 이동한다면? => 서쪽이 윗면으로 바뀌고 윗면이 동쪽, 동쪽이 아랫면, 아랫면이 서쪽으로 바뀜 북 남은 그대로
# [4,2,1,6,5,3]
# 서쪽으로 이동한다면? [3,2,6,1,5,4]
# 남쪽으로 이동한다면? [2,6,3,4,1,5]
# 북쪽으로 이동한다면? [5,1,3,4,6,2]
def dicing(d_index):
   a,b,c,d,e,f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
   if d_index == 1: #동
       dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d,b,a,f,e,c
   elif d_index == 2: #서
       dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = c,b,f,a,e,d
   elif d_index == 3: #북
       dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e,a,c,d,f,b
   elif d_index == 4: #남    
       dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b,f,c,d,a,e

이제 dicing은 끝났다. 이제는 실제로 굴려서 지도위에서 동작시켜야한다.

direction = [[0,1],[0,-1],[-1,0],[1,0]]

위의 direction이라는 리스트를 이용해서 지도위에서의 좌표를 계산해줬다.
그렇게 변경했을 때의 좌표와 dice의 밑바닥, 즉 dice[5]와 비교하여 지도가 0일 경우 지도에 dice[5]를 넣고 아닐경우 dice[5]에 지도의 값을 넣어주고 지도를 0으로 만들었다.

그리고 추가조건인 명령이 지도 밖으로 나가는 명령일 경우를 if문을 사용해서 처리해주었다. 아래는 전체 코드이다.

import sys
N, M, x, y, K = map(int, sys.stdin.readline().split())
ma = []
for i in range(N):
    ma.append(list(map(int, sys.stdin.readline().split())))
d=list(map(int, sys.stdin.readline().split()))

direction = [[0,1],[0,-1],[-1,0],[1,0]]
dice = [0,0,0,0,0,0]
#[1,2,3,4,5,6] 윗면이 1 동쪽이 3 서쪽이 4 아랫면이 6 북쪽이 2 남쪽이 5
# 만약 동쪽으로 이동한다면? => 서쪽이 윗면으로 바뀌고 윗면이 동쪽, 동쪽이 아랫면, 아랫면이 서쪽으로 바뀜 북 남은 그대로
# [4,2,1,6,5,3]
# 서쪽으로 이동한다면? [3,2,6,1,5,4]
# 남쪽으로 이동한다면? [2,6,3,4,1,5]
# 북쪽으로 이동한다면? [5,1,3,4,6,2]
def dicing(d_index):
    a,b,c,d,e,f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
    if d_index == 1: #동
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d,b,a,f,e,c
    elif d_index == 2: #서
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = c,b,f,a,e,d
    elif d_index == 3: #북
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e,a,c,d,f,b
    elif d_index == 4: #남    
        dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b,f,c,d,a,e
nx = x
ny = y
for d_index in d:
    nx += direction[d_index-1][0]
    ny += direction[d_index-1][1]
    if nx<0 or nx>N-1 or ny<0 or ny>M-1:
        nx -= direction[d_index-1][0]
        ny -= direction[d_index-1][1]
        continue

    dicing(d_index)
    if ma[nx][ny]==0:
        ma[nx][ny] = dice[5]
    else:
        dice[5] = ma[nx][ny]
        ma[nx][ny]=0
    print(dice[0])

감사합니다

0개의 댓글