상세 컨텐츠

본문 제목

[백준 23288번] 주사위 굴리기2(파이썬)

알고리즘 공부

by Tabris4547 2022. 2. 23. 23:01

본문

728x90

문제를 읽자마자 짜증이 확 밀려오는 길이.

처음에 이게 무슨 소리지?

하고 고민을 많이 하게 되죠.

이 문제는 앞선 로봇청소기 문제를 생각하니

대략적인 문제풀이 방법이

떠오르기는 쉽습니다.

여기서 문제는

'주사위가 굴러갈 때'.

이를 해결하기 위해

구글링을 해본 결과

딕셔너리라는 걸 써보는 풀이를 적용.

정육면체 주사위를 기준으로

저런 식으로 넘버링을 메겨봅니다.

동 서 남 북으로

주사위가 굴러갈 때

각각의 부분이 어디로 가는지

직접 손으로 써봤습니다.

저렇게 써보니 이해가 가네요.

(머릿속으로 주사위를 굴려보면서

따라가는 걸 추천드립니다.)

 

# 23288 주사위 굴리기 2

from sys import stdin
from collections import deque

input = stdin.readline

N, M, k = map(int, input().split())

mapping = [list(map(int, input().split())) for _ in range(N)]

start_y = 0
start_x = 0  # 시작위치

dice = {
    'top': 1,
    'bottom': 6,
    'up': 2,
    'down': 5,
    'left': 4,
    'right': 3
}  # 주사위 현황

# 동 북 서 남 방향
dy = [0, -1, 0, 1]
dx = [1, 0, -1, 0]

# 현재방향. 처음에는 start로 설정.
now_y = start_y
now_x = start_x
# 처음에는 동쪽을 가리킴.

dis = 0

answer = 0

for Turn in range(k):
    move_y = now_y + dy[dis]
    move_x = now_x + dx[dis]

    if move_y < 0 or move_y >= N or move_x < 0 or move_x >= M:
        dis = (dis - 2) % 4
        move_y = now_y + dy[dis]
        move_x = now_x + dx[dis]

    if dis == 0:  # 동쪽으로 굴러가는 경우
        dice['top'], dice['left'], dice['bottom'], dice['right'] = dice['left'], dice['bottom'], dice['right'], dice[
            'top']
    elif dis == 1:  # 북쪽으로 굴러가는 경우
        dice['top'], dice['down'], dice['bottom'], dice['up'] = dice['down'], dice['bottom'], dice['up'], dice['top']
    elif dis == 2:  # 서쪽으로 굴러가는 경우
        dice['top'], dice['right'], dice['bottom'], dice['left'] = dice['right'], dice['bottom'], dice['left'], dice[
            'top']
    else:  # 남쪽으로 굴러가는 경우
        dice['top'], dice['up'], dice['bottom'], dice['down'] = dice['up'], dice['bottom'], dice['down'], dice['top']
    # 지금 현재값(이동한 곳에 있는 값)
    now_point = mapping[move_y][move_x]

    # 바닥과 현재 값의 비교
    if dice['bottom'] > now_point:
        dis = (dis - 1) % 4
    elif dice['bottom'] < now_point:
        dis = (dis + 1) % 4
    else:
        dis = dis
    # 현재 값에 대해서 BFS해준다. 현재 칸은 간 걸로 치고, 다른 칸 탐색.
    count = 1
    q = deque()
    q.append((move_y, move_x))
    visited = [[False] * M for _ in range(N)]
    visited[move_y][move_x] = True

    while q:
        now_y, now_x = q.popleft()
        for i in range(4):
            s_y = now_y + dy[i]
            s_x = now_x + dx[i]

            if 0 <= s_y < N and 0 <= s_x < M and mapping[s_y][s_x] == now_point and not visited[s_y][s_x]:
                count += 1
                visited[s_y][s_x] = True
                q.append((s_y, s_x))

    answer += count * now_point

    now_y = move_y
    now_x = move_x
    # print(mapping[move_y][move_x],count)

print(answer)

 

 

python은 C와 다른 점이한 줄 한 줄 바꾸는 거 입력하지 않아도한 꺼번에 여러 변수를 교체할 수 있습니다.가독성면에서는 더 좋은 느낌.근데 실제로 써보니시간은 하나 하나 바꿀 때보다 약간 더 걸리게 나오네요.이 문제를 통해딕셔너리를 어떻게 쓰면 좋을지 한 수 배웠습니다^^

728x90

관련글 더보기

댓글 영역