공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 백준 14499. 주사위 굴리기

inspirit941 2019. 11. 21. 18:31
반응형

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

삼성SW역량평가 시뮬레이션 문제.

 

코드가 어렵다기보다는 문제를 이해하는 게 고통스러웠다.

 

문제를 풀기 위해서는

 

1. 주사위라는 객체를 만들고, 여섯 면을 정의한다.

2. 주사위의 이동 = 주사위 각 면 값을 바꾸어준다

 

두 가지가 떠올라야 했다.

 

주사위가 이동할 경우 각 면에 해당하는 값이 바뀌는 건 python에서는 a, b = b, a 형태로 쉽게 해결할 수 있다.

 

주사위 이동을 표현한 python 식을 이해하는 법

ex) 주사위를 동쪽으로 이동시킨다

= 이전 주사위의 동쪽 면 -> 아랫면

= 이전 주사위의 윗면 -> 동쪽 면

= 이전 주사위의 아랫면 -> 서쪽 면

= 이전 주사위의 서쪽 면 -> 윗면

이렇게 되는데, Python 등식 기준으로 오른쪽 값 -> 해당 위치의 왼쪽 값으로 변화한다고 이해하면 된다.

 

dice.e, dice.b, dice.w, dice.t = dice.t, dice.e, dice.b, dice.w 라고 하면

dice.t 값이 dice.e로 (윗면 -> 동쪽 면), dice.e값이 dice.b로(동쪽 면 -> 아랫면) 바뀌는 것이다.

 

 

import sys
height, width, start_y, start_x, _ = map(int, sys.stdin.readline().split())
maps = []
for _ in range(height):
maps.append(list(map(int, sys.stdin.readline().split())))
order = list(map(int, sys.stdin.readline().split()))
class Dice:
def __init__(self):
self.t = 0
self.b = 0
self.e = 0
self.w = 0
self.n = 0
self.s = 0
dice = Dice()
for i in order:
# 동쪽
if i == 1:
dy, dx = 0, 1
ny, nx = start_y + dy, start_x + dx
# 갈 수 있는 곳이면
if 0<= ny < len(maps) and 0 <= nx < len(maps[0]):
dice.e, dice.b, dice.w, dice.t = dice.t, dice.e, dice.b, dice.w
# 맵 값이 0이면 dice의 바닥값 복사
if maps[ny][nx] == 0:
maps[ny][nx] = dice.b
else:
# 맵 값이 0이 아니면 dice 바닥에 복사, 맵 값은 0으로
dice.b = maps[ny][nx]
maps[ny][nx] = 0
print(dice.t)
start_y, start_x = ny, nx
# 서쪽
elif i == 2:
dy, dx = 0, -1
ny, nx = start_y + dy, start_x + dx
if 0<= ny < len(maps) and 0 <= nx < len(maps[0]):
dice.w, dice.b, dice.e, dice.t = dice.t, dice.w, dice.b, dice.e
if maps[ny][nx] == 0:
maps[ny][nx] = dice.b
else:
# 맵 값이 0이 아니면 dice 바닥에 복사, 맵 값은 0으로
dice.b = maps[ny][nx]
maps[ny][nx] = 0
print(dice.t)
start_y, start_x = ny, nx
# 북쪽
elif i == 3:
dy, dx = -1, 0
ny, nx = start_y + dy, start_x + dx
if 0<= ny < len(maps) and 0 <= nx < len(maps[0]):
dice.n, dice.b, dice.s, dice.t = dice.t, dice.n, dice.b, dice.s
if maps[ny][nx] == 0:
maps[ny][nx] = dice.b
else:
# 맵 값이 0이 아니면 dice 바닥에 복사, 맵 값은 0으로
dice.b = maps[ny][nx]
maps[ny][nx] = 0
print(dice.t)
start_y, start_x = ny, nx
# 남쪽
elif i == 4:
dy, dx = 1, 0
ny, nx = start_y + dy, start_x + dx
if 0<= ny < len(maps) and 0 <= nx < len(maps[0]):
dice.s, dice.t, dice.n, dice.b = dice.t, dice.n, dice.b, dice.s
if maps[ny][nx] == 0:
maps[ny][nx] = dice.b
else:
# 맵 값이 0이 아니면 dice 바닥에 복사, 맵 값은 0으로
dice.b = maps[ny][nx]
maps[ny][nx] = 0
print(dice.t)
start_y, start_x = ny, nx
반응형