본문 바로가기
알고리즘 공부/Python

백준 14499. 주사위 굴리기 (Python)

by 킴워니 2020. 5. 1.

 

나는 왜 문제를 제대로 안 읽어서 내 자신을 힘들게 하는 것인가

 

문제는 이쪽!

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

 

나는 처음에 무슨 바람이 들었는지 몰라두 삼차원 배열정도 필요하다고 생각했다. 아직도 그 아이디어는 기억이 안나고 기억 난다고 해도 구현이 안될 것만 같아

그런데 사실 그 때 그때 굴렸을때 어떤 면이 어디로 가는지만 알면 되니까 그런건 상관없다. 

 

심지어 문제에서 친절하게 전개도도 그려두었기 때문에 그 대로 구현하면 된다!

 

문제는 나는 조건을 잘못 읽어서 계속 바닥면의 주사위가 0일때만 주사위에 값을 넣어주고 아니면 무시를 해서

구현은 끼깔나게 잘되는데 답이 계속 틀렸다... 

역시 내가 뭔가 잘못이 있을 때는 질문을 한번 더 읽어야겠다

 

 

아이디어

1. 전개도를 기준으로 일차원 배열로 주사위 만들기

2. 델타 이용해서 이동 후 값이 지도 안에 있는지 확인하고 아닐 경우 그냥 무시 후 다음 값 받기

3. 동, 서, 남, 북에 따라서 다음에 어떤 면이 오는지에 따라 array값 서로서로 바꿔주기

(파이썬은 a, b = b, a같은 c 입장에서 보면 말도 안되는 코드도 잘만 받아주기 때문에 temp를 만들어서 하나하나 바꿀 필요가 없는게 이 대목에서 큰 도움이 된다)

4. 맨 윗값 프린트!

 

코드

더보기
#백준 주사위 굴리기

def move(num, arr): #이동 함수
    if num == 1: #동
        arr[1], arr[3], arr[6], arr[4]= arr[4], arr[1], arr[3], arr[6]
    elif num == 2: #서
        arr[1], arr[3], arr[6], arr[4] = arr[3], arr[6], arr[4], arr[1]
    elif num == 3: #북
        arr[1], arr[5], arr[6], arr[2] = arr[5], arr[6], arr[2], arr[1]
    else: #남
        arr[1], arr[5], arr[6], arr[2] = arr[2], arr[1], arr[5], arr[6]
    print(arr[1]) #이동 가능한 경우에만 애초에 이 함수 안에 들어오기 때문에 이 함수 안에서 맨 위면의 값 출력해줌
    return arr

delta = [(0,0),(0,1), (0,-1), (-1,0),(1,0)]
N, M, x, y, K = map(int, input().split())
dice = [0,0,0,0,0,0,0]
maps = [list(map(int, input().split())) for _ in range(N)]
command = list(map(int, input().split()))
for cmd in command:
    if -1< x + delta[cmd][0] <N and -1 < y + delta[cmd][1] < M: #이동이 가능한지!
        x = x + delta[cmd][0]
        y = y + delta[cmd][1]
        dice = move(cmd, dice)
        if maps[x][y]: #지도에 값이 있을 경우 주사위 값 바꿔주고 지도 값 0으로 바꾸기
            dice[6] = maps[x][y]
            maps[x][y] = 0
        else: #지도에 값이 0일 경우 주사위 값을 지도에 옮겨주기
            maps[x][y] = dice[6]
    else:
        continue

'알고리즘 공부 > Python' 카테고리의 다른 글

백준 5373 큐빙 (Python)  (0) 2020.05.03
백준 15684 사다리조작 (python)  (0) 2020.05.03
백준 16234 인구 이동(Python)  (0) 2020.04.29
백준 15683 감시 (Python)  (0) 2020.03.17
백준 14501. 퇴사 (Python)  (0) 2020.03.12

댓글