본문 바로가기

IT 일기/코테

정육면체 한번 더 굴리기 - python

728x90
from collections import deque

dx=[0,1,0,-1]
dy=[1,0,-1,0]
def check_out(posX,posY):
    if posX < 0 or posX >= n or posY <0 or posY >= n:
        return False
    return True

def map_point():
    for i in range(len(maps)):
        for j in range(len(maps)):
            if maps[i][j][1] == 0:
                startX = i
                startY = j
                startInt = maps[i][j][0]
                stack = deque()
                stack.append([startX,startY])
                visited = {}
                while len(stack) != 0:
                    checkX,checkY = stack.popleft()
                    visited[(checkX,checkY)] = 1
                    for k in range(4):
                        endX = checkX+dx[k]
                        endY = checkY+dy[k]
                        if not check_out(endX,endY):
                            continue
                        if (endX,endY) in visited or maps[endX][endY][1] != 0 or maps[endX][endY][0] != startInt:
                            continue
                        visited[(endX,endY)] = 1
                        stack.append([endX,endY])
                tCount = len(visited)
                for k,_ in visited.items():
                    maps[k[0]][k[1]][1]=tCount*startInt

def roll():
    global dir
    global dice_pos
    dPosX , dPosY = dice_pos
    under_dice = 7-dice[0]
    #주사위 밑이랑 격자판 비교해서 방향 선택
    if under_dice > maps[dPosX][dPosY][0]:
        dir = (dir+1)%4
    elif under_dice < maps[dPosX][dPosY][0]:
        dir = (dir - 1) % 4
    #선택된 방향으로 1회 굴림
    n_dPosX = dPosX + dx[dir]
    n_dPosY = dPosY + dy[dir]

    # 굴린게 밖으로 나갔다면 방향을 바꿔서 굴림
    if not check_out(n_dPosX,n_dPosY):
        if dir==0:
            dir=2
        elif dir == 1:
            dir=3
        elif dir == 2:
            dir=0
        else:
            dir=1
        n_dPosX = dPosX + dx[dir]
        n_dPosY = dPosY + dy[dir]
    dice_pos=[n_dPosX,n_dPosY]
    change_dice_status()
    roll_checkpoint(n_dPosX,n_dPosY)
def roll_checkpoint(posX,posY):
    global answerPoint
    answerPoint += maps[posX][posY][1]
def change_dice_status():
    global dir
    global dice
    if dir == 0:
        dice = [7-dice[2],dice[1],dice[0]]
    elif dir == 1:
        dice = [7-dice[1],dice[0],dice[2]]
    elif dir == 2:
        dice = [dice[2],dice[1],7-dice[0]]
    else:
        dice = [dice[1],7-dice[0],dice[2]]



n,m = map(int,input().split())
maps = []
for _ in range(n):
    maps.append(list(map(int,input().split())))
for i in range(len(maps)):
    for j in range(len(maps)):
        maps[i][j] = [maps[i][j],0]
map_point()

dice = [4,2,1]
dice_pos = [0,1]
dir = 0 #0,1,2,3 / 우 하 좌 상
answerPoint=maps[0][1][1]
for i in range(m-1):
    roll()
print(answerPoint)

생각할 것들

1. 점수 계산 : 변하지 않는 값이므로 사전에 미리 계산해서 넣어주기

2. 주사위 정보 : dice = [맨위, 정면, 오른쪽] 세개의 정보만 저장해서 사용

 

이외의 것들은 문제에 나와있는 그대로 사용

728x90

'IT 일기 > 코테' 카테고리의 다른 글

2023 상반기 삼성 코테 후기  (0) 2023.04.09
이상한 체스 - python  (0) 2023.04.08
코드트리 빵 - python  (0) 2023.04.08
17070 / 파이프 옮기기 1 파이썬  (0) 2023.04.07
16637번 / 괄호 추가하기 - 파이썬  (0) 2023.04.06