본문 바로가기
코테 공부 🔥

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

by 서니서닝 2023. 4. 17.
728x90

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

 

1041번: 주사위

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

www.acmicpc.net

문제 요약 : 아래의 그림과 같은 전개도를 가진 주사위가 있다. 동일한 주사위N^3개를 가지고 NxNxN 크기의 정육면체를 만드려고 한다. 해당 정육면체가 탁자위에 놓여있다고 가정할 때, 5개의 면에 보이는 수의 합의 최솟값을 출력하라.

예제 입력 1

2
1 2 3 4 5 6

예제 출력 1

36

📌 풀이 )

간단한 문제였는데, 문제를 잘못 이해해서 한참을 걸렸다.

문제만 똑바로 이해하면 쉬운 문제..!!!! (나만 이해하기 어려웠을 수도 있음)

처음에 아무 생각없이 정육면체가 같은면이면, 모든 주사위가 같은 값을 가져야한다고 생각했다.

그래서 문제를 풀었는데 계속 답이 너무 크게 나온것이다... 직접 그림을 그려보면서 문제를 이해했다.

ㅋㅋㅋㅋㅋ 열심히..그려봤다..^^

N이 4일경우, 저렇게 정육면체의 한 면에도 여러개의 숫자가 존재할 수 있다.

1개의 면만 보이는 주사위일 경우, 최솟값이기 때문에 무조건 가장 작은 값이 출력되도록 하면된다.

2개의 면이 보이는 주사위일 경우, 다른 쌍이면서 가장 작은 값 두가지를 보이게 하면 된다.

3개의 면이 보이는 주사위일 경우, 세 쌍중 작은 값들만 보이게 하면 된다.

 

그려놓고 보니 너무 간단했던 문제!

 

다른 분들은 1개의 면만 보이는 개수도 N을 이용한 함수로 표현하셨던데, 나는 그냥 N*N*5 에다가 빼는 방식으로 구현했다.

참고로, 1개의 면만 보이는 경우의 개수는 (4*(N-2) + 5*(N-2)**2)인데 딱히 크게 코드의 성능에 유의미한 영향을 끼치진 않는듯 했다.

# 주사위
N = int(input())
dice = list(map(int,input().split(' ')))
square = N*N*5
answer = 0

if N == 1 :
    dice.sort()
    print(sum(dice[:5]))
else :
    answer = 0
    pair = []
    for i in range(3):
        pair.append(min(dice[i],dice[-1-i]))
    pair.sort()

    # 3면이 모두 보이는 경우
    answer += 4*sum(pair)
    square -= 4*3

    # 2면이 모두 보이는 경우
    answer += (8*N-12)*sum(pair[:2])
    square -= (8*N-12)*2
    
    # 1면만 보이는 경우
    answer += square*pair[0]
    print(answer)
728x90

댓글