본문 바로가기

Problem Solving/Python

[BOJ] 14449 주사위 굴리기

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