본문 바로가기
코딩테스트/백준

[백준] 1041: 주사위 파이썬 리뷰

by 윤호 2021. 2. 19.
 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수

www.acmicpc.net

풀이는 해당 블로그를 참고했습니다.

 

처음 보는 유형이라 굉장히 복잡하게 느껴졌습니다. 하지만 주사위 면이 보이는 경우에 따라 나눠 생각하면 3가지 밖에 되지 않기 때문에 생각한 거 보다 간단했습니다.

 

(M 면이 보이는 주사위의 수) X (M 면의 최소합) 으로 3가지 경우를 모두 구해 더해주면 됩니다.

 

M 면의 최소합을 구하는 것이 굉장히 생소했습니다.

주사위 특성상 마주보는 면을 제외하고 모든 면이 인접해있다.
따라서 A,B,C,D,E,F를 사용자에게 입력받았을 때
0과5, 1과4, 2와3중 최소 값을 리스트에 저장하고
1면, 2면, 3면의 경우에 따라 더 작은 것부터 더해서 사용하면 된다.

참조한 블로그에선 이렇게 설명을 해주셨는데, 더 쉽게 설명하기가 힘든 것 같습니다.

실제로 따져보면 납득이 가는데, 해당 방법을 사용한 경험이 없다면 생각해내기 힘든 방법인 것 같습니다.

기억해 두면 도움이 될거 같습니다. 저는 이 부분을 기록하기 위해 포스팅을 했습니다.

 

파이썬 코드

N = int(input())
dice = list(map(int, input().split()))

if N == 1:
    print(sum(dice)-max(dice))
else:
    sumList = [min(dice[0], dice[5]),
               min(dice[1], dice[4]),
               min(dice[2], dice[3])]
    sumList.sort()

    n1 = (N-2)*(N-2) + (N-1)*(N-2)*4
    n2 = (N-2)*4 + (N-1)*4
    n3 = 4

    ans = n1 * sumList[0] + n2 * sum(sumList[:2]) + n3 * sum(sumList)
    print(ans)

 

댓글