BOJ - 14499 - 주사위 굴리기

17453 단어 pythonbaekjoonbaekjoon

문제

https://www.acmicpc.net/problem/14499

풀이

아이디어

딱히 머리 쓸 거 없이, 열심히 구현을 하자. 예제를 노트에 따라가려닌까 오히려 머리 아프다. 일단 문제에 설명된 기능을 다 구현해보고 실행해본 뒤에 문제가 있다면 그 때 디버깅하는게 편하더라.

함수를 분리해서 구현하는 것이 디버깅도 편하고 구현도 편하다.

Dice 라는 클래스를 만든 뒤 메서드로 change, devchange, move를 만든다.

각각의 기능은

change : 주사위의 현재 위치를 받아 Map의 바닥과 주사위의 바닥을 바꾸는 메서드

devchange : 주사위가 움직인 (구른) 방향을 받아 전개도를 바꿔주는 메서드

move : 방향을 받으면 주사위 위치를 움직여주고 (경계 확인) 위 두 메서드를 실행시킨 뒤 주사위 윗 면의 숫자를 출력한다.


구현

class Dice:
    def __init__(self,N,M,x,y,Map):
        self.boundary = (N,M)
        self.x = x
        self.y = y
        self.Map = Map
        '''
            1
        3   0   2
            4
            5
        '''

        self.dev = [0,0,0,0,0,0]

Dice 위치, 맵, 전개도 dev를 속성으로 가지자.
전개도 바닥은 dev[-1] 상단은 dev[0]이 된다.

    def change(self,x,y):
        if self.Map[x][y]:
            self.dev[-1] = self.Map[x][y]
            self.Map[x][y] = 0
        else:
            self.Map[x][y] = self.dev[-1]
        

change 메서드, 문제의 조건에 맞게 Map과 전개도 바닥의 숫자를 바꾸거나 전개도 바닥의 숫자를 Map에 옮겨쓴다.

    def devch(self,dir):
      tmp = self.dev[:]
      if dir == 0:
          self.dev = [tmp[4],tmp[0],tmp[2],tmp[3],tmp[5],tmp[1]]
      elif dir == 2:
          self.dev = [tmp[1], tmp[5], tmp[2], tmp[3], tmp[0], tmp[4]]
      elif dir == 1:
          self.dev = [tmp[2], tmp[1], tmp[5], tmp[0], tmp[4], tmp[3]]
      elif dir == 3:
          self.dev = [tmp[3], tmp[1], tmp[0], tmp[5], tmp[4], tmp[2]]

dev change 메서드 경우가 몇개 없어서 그냥 직접 썼다.

해당 방향으로 주사위가 굴렀을 때 전개도가 어떻게 바뀌는지 구현한 것

    def move(self,dir):
        dx = [-1, 0, 1, 0]
        dy = [0, -1, 0, 1]
        nx = self.x + dx[dir]
        ny = self.y + dy[dir]
        if (self.boundary[0] > nx >= 0 and self.boundary[1] > ny >= 0):
            self.x = nx
            self.y = ny
            self.devch(dir)
            self.change(nx,ny)
            print(self.dev[0])

move 함수, 경계 안이면 좌표를 이동하고 뒤집어 주고 (devch) 바닥이랑 바꿔주고 (change) 출력



N, M, x, y, K = map(int,readline().split())
Map = [list(map(int,readline().split())) for _ in range(N)]
order = list(map(int,readline().split()))

dir_dict = {4:2, 3:0, 2:1, 1:3}

dice = Dice(N,M,x,y,Map)

for i in order:
   dice.move(dir_dict[i])

main 함수, 인풋 받고, 방향 내 입맛대로 재설정하고 order 순서대로 굴려주면 끄읕


결과

딱 이정도 난이도의 구현 문제는 푸는게 너무 재밌더라. ㅎㅅㅎ;;

좋은 웹페이지 즐겨찾기