문제를 읽자마자 짜증이 확 밀려오는 길이.
처음에 이게 무슨 소리지?
하고 고민을 많이 하게 되죠.
이 문제는 앞선 로봇청소기 문제를 생각하니
대략적인 문제풀이 방법이
떠오르기는 쉽습니다.
여기서 문제는
'주사위가 굴러갈 때'.
이를 해결하기 위해
구글링을 해본 결과
딕셔너리라는 걸 써보는 풀이를 적용.
정육면체 주사위를 기준으로
저런 식으로 넘버링을 메겨봅니다.
동 서 남 북으로
주사위가 굴러갈 때
각각의 부분이 어디로 가는지
직접 손으로 써봤습니다.
저렇게 써보니 이해가 가네요.
(머릿속으로 주사위를 굴려보면서
따라가는 걸 추천드립니다.)
# 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와 다른 점이한 줄 한 줄 바꾸는 거 입력하지 않아도한 꺼번에 여러 변수를 교체할 수 있습니다.가독성면에서는 더 좋은 느낌.근데 실제로 써보니시간은 하나 하나 바꿀 때보다 약간 더 걸리게 나오네요.이 문제를 통해딕셔너리를 어떻게 쓰면 좋을지 한 수 배웠습니다^^
[프로그래머스]프린터(파이썬) (0) | 2022.03.03 |
---|---|
[백준 15685번] 드래곤 커브 (1) | 2022.02.28 |
[백준14503번]로봇청소기(파이썬) (0) | 2022.02.21 |
[프로그래머스]Lv.2 타겟넘버(파이썬) (0) | 2022.02.16 |
[백준 2667번] 단지 번호 붙이기 (파이썬) (0) | 2022.02.15 |
댓글 영역