ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_2116_주사위 쌓기(python)
    Algorithm/백준_생각정리 2023. 4. 6. 14:39

    ※ 접근법

     주사위 갯수가 최대 만 개였지만 따져야할 주사위 면에 주사위 숫자는 1~6으로 고정돼 있었기 때문에 경위의 수가 많지 않다고 생각해 문제에서 시키는 대로 구현하면 풀릴 것이라고 생각했다.

     

    ※ 풀이

    (전체적인 관점 : 주사위 윗면 아랫면에 4,5,6이 없다면 옆면으로는 계속 회전시킬 수 있기 때문에 어떻게든 최대인 기둥이 만들어진다. 그렇다면 윗면 아랫면에 6 or 5 or 4가 없는지 확인하고 없다면 elif문으로 걸러서 제일 큰 숫자를 더해준다.

     1. 첫 번째 주사위에 윗면을 담당할 숫자는 1~6까지가 있다.

     2. 윗면 아랫면에 4,5,6이 없었다면 임의 변수 temp에 6또는 5또는 4를 더해준다.

     3. 이것을 마지막 주사위까지 반복해주면 되는 간단한(?) 문제였다.

     

    n = int(input())
    
    data = []
    
    for i in range(n):
        data.append(list(map(int,input().split())))
    
    dx = [[0,5],[1,3],[2,4]]
    count = 0
    for i in range(6): # 첫 주사위에 윗면이 위를 향하는 숫자의 인덱스
        temp = 0    
        up_idx = i
        down_idx = 0
        
        for x,y in dx:
            if up_idx == x or up_idx == y:
                down_idx = (x+y) - up_idx
                break
        if 6 not in [data[0][up_idx],data[0][down_idx]]:
            temp += 6
        elif 5 not in [data[0][up_idx],data[0][down_idx]]:
            temp += 5
        elif 4 not in [data[0][up_idx],data[0][down_idx]]:
            temp += 4
        for j in range(1,n): # 두 번재 주사위부터 끝까지
            down_idx = data[j].index(data[j-1][up_idx])
            for x,y in dx:
                if down_idx == x or down_idx == y:
                    up_idx = (x+y) - down_idx
                    break
            if 6 not in [data[j][up_idx],data[j][down_idx]]:
                temp += 6
            elif 5 not in [data[j][up_idx],data[j][down_idx]]:
                temp += 5
            else:
                temp += 4
        count = max(count, temp)
    print(count)

    ※ 회고

    할 수 있다.

Designed by Tistory.