https://www.acmicpc.net/problem/14499
주어진 보드 위에서 규칙대로 주사위를 굴리고 주사위의 변화를 출력하는 문제.
1/ 조건
1) n*m 격자의 보드 정보, 주사위의 시작 위치가 주어진다.
2) 주사위는 동서남북으로 굴릴 수 있으며, 한 번에 한 방향으로 한 칸씩 굴리는 명령어가 k개 주어진다.
3) 주사위와 보드 숫자 사이의 상호작용이 있는데 자세한 건 링크를 참조하자.
2/ 설계
단순한 구현 문제. 규칙은 간단하다. 방향에 따른 주사위의 회전을 코드로 표현하는 게 거의 전부라고 봤다.
3/ 구현
# preset
top = 0
east = 1
west = 2
north = 3
south = 4
bottom = 5
dx = [0, 0, 0, -1, 1] # 0-th idx is dummy
dy = [0, 1, -1, 0, 0]
def roll_the_dice(dir):
if dir == east:
dice[top], dice[west], dice[bottom], dice[east] \
= dice[west], dice[bottom], dice[east], dice[top]
elif dir == west:
dice[top], dice[east], dice[bottom], dice[west] \
= dice[east], dice[bottom], dice[west], dice[top]
elif dir == north:
dice[top], dice[south], dice[bottom], dice[north] \
= dice[south], dice[bottom], dice[north], dice[top]
else: #south
dice[top], dice[north], dice[bottom], dice[south] \
= dice[north], dice[bottom], dice[south], dice[top]
# body
dice = [0, 0, 0, 0, 0, 0]
n, m, x, y, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
cmds = list(map(int, input().split()))
nx, ny = x, y
for cmd in cmds:
nx += dx[cmd]
ny += dy[cmd]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
nx -= dx[cmd]
ny -= dy[cmd]
continue
roll_the_dice(cmd)
if board[nx][ny] == 0:
board[nx][ny] = dice[bottom]
else:
dice[bottom] = board[nx][ny]
board[nx][ny] = 0
print(dice[top])
4/ 결과

5/ 후기
1) 오랜만에 알고리즘 문제를 풀었다. 이유는 머리에 기름칠 좀 할까 해서. 입력 받는 부분이 제일 어려웠다ㅋㅋ 한동안은 문제를 풀 거 같고, 의외로 빨리 질릴 수도 있다.
2) 원래라면 top, east... 등은 enum으로써 대문자로 써야 했을 텐데 귀찮아서 그렇게까진 하지 않았다. 애초에 Python에서 enum은 클래스를 써야 할 수밖에 없기도 하고. enum이 정말 좋은 아이디어긴 한 것 같다. 예전 같았으면 top이고 뭐고 그냥 숫자 바로 박아서 문제 풀었을 텐데 이런 점은 성장한 걸까? 습관적으로는 south도 elif로 쓰고 else에 assertion을 박아넣어야 할 거 같았는데 성장한 게 맞긴 한 듯ㅋㅋ
3) Python이 언어 디자인적인 측면에서 아쉬운 부분이 많다는 것을 느꼈다. Python은 사용하기도 쉽고, 실수하기도 쉽다.
예를 들어 roll_the_dice라는 함수의 이름은 원래 roll이었다. 하지만 dice를 인자로 받지 않으니 preset이 숨겨져 있다고 가정했을 때 body만 보고서 동작을 유추하기가 어렵달까. C/C++은 (이름 + 인자 + 반환형) - 즉 함수의 시그니처(혹은 프로토타입)가 함수의 동작을 예측하게 한다. 하지만 Python은 dynamic type이라는 미명 아래 함수의 반환형도 인자의 스코프도 좀 뒤죽박죽이다. Python으로 프로그래밍을 시작하지 말아야 한다고 주장하는 사람들도 이해가 된다.
'Problem Solving > Python' 카테고리의 다른 글
| [BOJ] 17299 오등큰수 (1) | 2024.07.13 |
|---|---|
| [BOJ] 1695 팰린드롬 만들기 (0) | 2024.06.20 |
| [BOJ] 1799 비숍 (0) | 2024.05.10 |
| [BOJ] 5525 IOIOI (8) | 2024.03.18 |
| [BOJ] 17070 파이프 옮기기 1 (0) | 2024.03.09 |