Algorithm/Python

[백준 14499] 주사위 굴리기

🥭맹2 2021. 4. 16. 20:56

1. 문제

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개의 줄에 지도

www.acmicpc.net

2. 접근 방법

주사위를 돌렸을 때 생각해내는게 어려웠습니다.

초기 상태는 바닥이 1이고 위쪽이 6인데,

계속 바닥이 1이라고 했을 때 그 값에 들어갈 것은

위로 주사위를 굴릴 경우 2에 위치한 값,

아래로 주사위를 굴릴 경우 5에 위치한 값,

우측으로 주사위를 굴릴 경우 3에 위치한 값,

좌측으로 주사위를 굴릴 경우 4에 위치한 값

입니다.

 

이렇게 생각해야 바닥은 계속해서 1이고, 위쪽은 6이 됩니다.

 

이 개념만 가지고 간다면 전혀 문제 될 것이 없다 ..!

 

그래서 이번 문제는 함수를 3개 만들었습니다.

1. 주사위를 굴리는 함수: rotate

2. board위에서 주사위가 이동하는 것: move

3. board의 영역을 벗어났는지 확인하는 것: isWall (벽이냐 아니냐 요런 느낌인데, 그냥 길이아니냐 라는 느낌으로다가 쓴 것임다)

3. 코드

python

def isWall(x, y):
    if x < 0 or x >= M or y < 0 or y >= N:
        return True
    return False

def move():
    global dirs
    dir = dirs[0]
    if dir == 1:
        return (1, 0)
    elif dir == 2:
        return (-1, 0)
    elif dir == 3:
        return (0, -1)
    elif dir == 4:
        return (0, 1)

def rotate():
    global dirs, nx, ny
    while dirs:
        dx, dy = move()
        tx = nx + dx
        ty = ny + dy

        if not isWall(tx, ty):
            if (dx, dy) == (1, 0):
                dice[1], dice[3], dice[6], dice[4] = dice[3], dice[6], dice[4], dice[1]
            elif (dx, dy) == (-1, 0):
                dice[1], dice[3], dice[6], dice[4] = dice[4], dice[1], dice[3], dice[6]
            elif (dx, dy) == (0, 1):
                dice[1], dice[2], dice[6], dice[5] = dice[5], dice[1], dice[2], dice[6]
            elif (dx, dy) == (0, -1):
                dice[1], dice[2], dice[6], dice[5] = dice[2], dice[6], dice[5], dice[1]

            if board[ty][tx] == 0:
                board[ty][tx] = dice[1]
            else:
                dice[1] = board[ty][tx]
                board[ty][tx] = 0
            nx, ny = tx, ty
            ans.append(dice[6])
        dirs.pop(0)

N, M, sy, sx, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
dirs = list(map(int, input().split()))
dice = [0] * 7
nx, ny = sy, sx
ans = []

rotate()
print(*ans, sep="\n")

4. 마치며

한 번은 맞왜틀을 외쳤었는데여

맞왜틀

그 이유는

문제를 제대로 안읽었기 때문이죠

하하하

 

x는 행이고 y가 열이었습니다.

하하하

 

하필 테스트케이스로 주어진 친구들이 모두 x, y좌표가 동일했기 때문에 테스트케이스에서는 문제가 없었습니다 ㅠ

 

어쩐지 채점을 시작하자마자 틀리더라구욧~!

 

눙물 주르륵

 

문제를 더욱 꼼꼼히 읽읍시다

'Algorithm > Python' 카테고리의 다른 글

[백준 17136] 색종이 붙이기  (0) 2021.04.17
[백준 14500] 테트로미노  (0) 2021.04.16
[백준 12100] 2048(Easy)  (0) 2021.04.15
[백준 13460] 구슬 탈출2  (0) 2021.04.15
[백준 1580] 위치 바꾸기  (0) 2021.04.14