baekjoon 풀이

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

콜레오네 2021. 4. 18. 07:19

※문제 출처

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

www.acmicpc.net


명령을 통해 주사위가 계속 움직이는 프로그램입니다.

주사위를 클래스로 설정하여 구현했습니다.

 

주사위 모든 면의 숫자를 알 수 있게 dictionary를 선언해줍니다.

dice = { key : 주사위 면, value : 적힌 숫자 }

 

changeDice 함수

방향을 입력하면 주사위의 모양이 변경됩니다.

주사위 모양은 바닥, 왼쪽, 앞쪽에 위치하는 주사위 면을 통해 알 수 있습니다.

어느 방향으로 움직이는지를 통해, 바닥, 왼쪽, 앞쪽 면을 변경해주고, y와 x 값도 변경해줍니다.

이때, 주사위가 바깥으로 벗어나려 한다면 명령을 무시합니다.

 

changeMapDiceNumber 함수

주사위가 변경되었다면, 지도와 주사위 바닥의 숫자를 변경해주어야 합니다.

 

주의 !!

분명 올바르게 구현했는데, 자꾸 TestCase를 시작조차 못해보고 틀렸다고 나와서 굉장히 당황했습니다.

오류가 난 것도 아니고, 일부 TestCase가 틀린 것도 아니고....

결국 문제는 x, y 값에 있었네요. 당연히 평소대로 좌표평면이라 생각하고 풀었는데 그게 아니었습니다.

최초 입력받을 때, y와 x 순서를 바꾸어주니 통과했네요......;;

 

class Dice:
    def __init__(self, N, M, x, y, k, maps):
        self.N = N
        self.M = M
        self.x = x
        self.y = y
        self.k = k
        self.map = maps # 지도
        self.bottom = 6 # 바닥
        self.front = 5 # 앞
        self.west = 4 # 서쪽
        self.dice = { # 주사위
            1: 0,
            2: 0,
            3: 0,
            4: 0,
            5: 0,
            6: 0
        }
        

    # 방향 입력
    # 주사위 모양 변경
    def changeDice(self, moving):
        # 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
        # 바깥으로 벗어나려 하면, 명령 무시
        if (self.y == 0 and moving == 3) or \
        (self.y == self.N-1 and moving == 4) or \
        (self.x == 0 and moving == 2) or \
        (self.x == self.M-1 and moving == 1) :
            return False
        
        if moving == 1: # 동쪽
            temp = self.bottom
            self.bottom = 7 - self.west
            self.west = temp
            self.x += 1
        elif moving == 2: # 서쪽
            temp = self.bottom
            self.bottom = self.west
            self.west = 7 - temp
            self.x -= 1
        elif moving == 3: # 북쪽
            temp = self.front
            self.front = 7 - self.bottom
            self.bottom = temp
            self.y -= 1
        elif moving == 4: # 남쪽
            temp = self.front
            self.front = self.bottom
            self.bottom = 7 - temp
            self.y += 1

        return True
    
    # 지도와 주사위 숫자 변경
    def changeMapDiceNumber(self):
        if self.map[self.y][self.x] == 0:
            self.map[self.y][self.x] = self.dice[self.bottom]
        else:
            self.dice[self.bottom] = self.map[self.y][self.x]
            self.map[self.y][self.x] = 0
        return



if __name__ == "__main__":
    
    N, M, y, x, k = [ int(x) for x in input().split() ]
    maps = []
    for _ in range(N):
        maps.append( [ int(x) for x in input().split()] )

    moving = [ int(x) for x in input().split()]
    

    d = Dice(N, M, x, y, k, maps) #클래스 선언
    for m in moving: # 명령 하나씩
        if d.changeDice(m): # 만약 바깥으로 벗어나지 않으면
            d.changeMapDiceNumber() # 지도와 주사위 숫자 변경
            print( d.dice[7 - d.bottom] ) # 주사위 위쪽 출력
반응형