https://www.acmicpc.net/problem/14499
파이썬 클래스 구현을 연습하기 좋은 문제이다.
우선 문제 부터 이해해보자. 첫줄에는 지도의 크기 N과 M, 주사위가 놓인 시작점 x, y,
명령의 개수 K가 주어진다. 그 후에는 세로 N, 가로 M짜리 지도가 주어진다.(좌표 순서 주의)
지도의 각 칸에는 숫자가 적혀 있다.
마지막 줄에는 명령의 개수 K만큼의 명령이 주어진다.
동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4 라는 규칙을 따른다.
좌표의 기준은 지도에서 가장 북쪽이면서 가장 서쪽인 지점이 0이며,
x, y좌표는 기준점으로 부터 각각 남쪽으로, 쪽으로 떨어지 칸수이다. (이 또한 방향에 주의)
이제 주어진 입력을 토대로 시뮬레이션을 돌리면 된다. 규칙은 다음과 같다.
처음 주사위의 각 면에는 0이 적혀있다. 그 후, 명령에 따라서 지도 위에서 주사위를 굴린다.
만약 주사위의 바닥면과 인접한 지도칸의 값이 0이 아니면 그 값을 주사위에 복사한 후, 그 칸의 간격에는 0을 채워 넣는다.
만약 지도에 0이 적혀 있으면 주사위의 바닥면에 쓰여있는 값이 칸에 복사된다.
주사위를 명령에 따라 옮긴 후에는 주사위의 윗면에 적혀있는 숫자를 출력한다.
우선은 주사위가 굴러가는 것을 구현해야 하는데, 이는 클래스를 이용하였다.
우선 초기값은 주사위의 6개의 면을 0으로 __init__에 초기화 해준다.
그 후에는 동서남북 회전에 따라 값을 스왑시켜주는 함수를 만들어준다. 값을 묶어서 바꿔주는 것은 소괄호를 사용해야 한다는 사실을 새로이 배웠다. 파이썬에서 여러 값을 동시에 바꾸려면 괄호 없이도 가능하지만, (a, b) = (b, a)처럼 튜플 형태로 스왑하면 안정적으로 작동하고, 순서를 신경 쓸 필요 없이 한번에 바뀐다. 이 문법은 packing-unpacking이라고 한다.
메인함수에서는 a라는 객체를 만들어준다 (a라는 주사위 한 개를 생성하고, 그 주사위의 상태(면 값 등)를 추적할 수 있게 해준다)
그 후에는 첫줄의 n,m, x, y, k를 입력받고
n개의 줄에 지도의 정보를 입력 받아 이차원 리스트를 선언한다. 명령 또한 리스트로 받는다.
그 후에는 명령의 개수 k 만큼 시뮬레이션을 진행한다. 범위를 벗어나는 좌표를 제외한 후,
주사위를 굴려준다. 굴리는 시행은 현재 위치를 기준으로 하기 때문에 위치에 대한 정보 또한 함께
전송해준다.
그 후에는 각 시행 마다 주사위의 윗면에 저장되어 있는 정보를 출력해주면 끝난다.
class dice :
def __init__(self):
self.top=0
self.bottom=0
self.east=0
self.west=0
self.front=0
self.back=0
def roll(self, com):
if com==1: #동쪽
self.top, self.bottom, self.east, self.west = (
self.west, self.east, self.top, self.bottom
)
elif com==2:#서쪽
self.top, self.bottom, self.east, self.west = (
self.east, self.west, self.bottom, self.top
)
elif com==3: #북쪽
self.top, self.bottom, self.back, self.front = (
self.front, self.back, self.top, self.bottom
)
elif com==4: #남쪽
self.top, self.bottom, self.back, self.front = (
self.back, self.front, self.bottom, self.top
)
a=dice()
n, m, x, y, k = map(int, input().split())
mp = [list(map(int, input().split())) for _ in range(n)] #리스트 속에서 리스트를 입력 받는 방식
com = list(map(int, input().split()))
nx, ny = x, y
for i in range(k):
if com[i]==1:
ny=y+1
elif com[i]==2:
ny=y-1
elif com[i]==3:
nx=x-1
else :
nx=x+1
if nx<0 or nx>=n or ny<0 or ny>=m :
nx, ny = x, y
continue
a.roll(com[i])
if mp[nx][ny] == 0:
mp[nx][ny] = a.bottom
else:
mp[nx][ny], a.bottom = 0, mp[nx][ny]
x, y = nx, ny
print(a.top)

'알고리즘' 카테고리의 다른 글
| Boj 2941 크로아티아 알파벳 Python (1) | 2025.08.17 |
|---|---|
| Boj 1043 거짓말 Python - 분리 집합 (3) | 2025.08.17 |
| Boj 2310 c++ 어드벤처 게임 (0) | 2025.07.24 |
| Boj 14501 c++ 퇴사 (0) | 2025.07.20 |
| Boj 7571 c++ 점 모으기 (0) | 2025.07.20 |