For Programmer

백준 2116번 파이썬 문제풀이(주사위 쌓기) 본문

코팅테스트/백준 문제 모음

백준 2116번 파이썬 문제풀이(주사위 쌓기)

유지광이 2022. 1. 27. 21:14
728x90


 

이 문제는 브루트 포스라는 힌트를 조금 얻었다. 푸는 방식은 첫번째 주사위의 0~5 번째 인덱스가 각각 젤위로 왔을 때 를 가정하고 총 6번을 반복문을 시작하면 된다. 예를들어 첫번째 주사위의 0번째 인덱스가 맨위로 왔다면 그다음 주사위의 맨 아래 와야하는값은 그 전 주사위의 0번째 인덱스 값이고 젤 위로 올라가야 하는 값은 그와 마주보고 있 는 5번째 인덱스의 값이 젤 위로 올라와야 한다. 이런식으로 조건을 분기 해서 코드를 짜면 쉽게 정답을 찾을 수 있다.

 

N = int(input())
dice = [list(map(int, input().split())) for _ in range(N)]
new_len = []  # 0~5 인덱스 시작을 기준으로 주사위의 옆면 최고치 합을 모아 놓을 리스트 선언

for i in range(6):  # 주사위 하나의 길이 만큼 돈다.
    start = i  # 시작 값의 인덱스를 start라는 변수에 대입
    result = 0  # 결과값을 0으로 초기화
    for j in range(len(dice)):  # 입력받은 주사위의 길이만큼 돈다.

        if start == 0 or start == 5:  # 만약 주사위의 인덱스가 0 이나 5라면
            result += max(dice[j][1:5])  # 0, 5번을 제외한 나머지 주사위 면중 가장 큰 값을 더해준다
            if j != len(dice) - 1 and start == 0:  # 만약 인덱스가 마지막이 아니고 0이 라면
                start = dice[j + 1].index(dice[j][5])  # 다음 인덱스 값을 현재5번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입
            elif j != len(dice) - 1 and start == 5:  # 만약 인덱스가 마지막이 아니고 5 라면
                start = dice[j + 1].index(dice[j][0])  # 다음 인덱스 값을 현재0번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입

        elif start == 2 or start == 4:  # 만약 주사위의 인덱스가 2 이나 4라면
            result += max(dice[j][0:2] + [dice[j][3]] + [dice[j][5]])  # 2, 4번을 제외한 나머지 주사위 면중 가장 큰 값을 더해준다
            if j != len(dice) - 1 and start == 2:  # 만약 인덱스가 마지막이 아니고 2이 라면
                start = dice[j + 1].index(dice[j][4])  # 다음 인덱스 값을 현재4번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입
            elif j != len(dice) - 1 and start == 4:  # 만약 인덱스가 마지막이 아니고 4 라면
                start = dice[j + 1].index(dice[j][2])  # 다음 인덱스 값을 현재2번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입

        elif start == 1 or start == 3:  # 만약 주사위의 인덱스가 1 이나 3라면
            result += max([dice[j][0]] + [dice[j][2]] + dice[j][4:])  # 1, 3번을 제외한 나머지 주사위 면중 가장 큰 값을 더해준다
            if j != len(dice) - 1 and start == 1:  # 만약 인덱스가 마지막이 아니고 1이 라면
                start = dice[j + 1].index(dice[j][3])  # 다음 인덱스 값을 현재3번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입
            elif j != len(dice) - 1 and start == 3:  # 만약 인덱스가 마지막이 아니고 3이 라면
                start = dice[j + 1].index(dice[j][1])  # 다음 인덱스 값을 현재1번째 인덱스가 존재하는 값을 다음 주사위에서 찾아서 대입
    new_len.append(result) # N개의 주사위를 다 돈 N개의 옆면 합을 대입한다.

print(max(new_len)) # 그중 가장 큰 값을 출력
728x90
Comments