백준1041(파이썬) - 주사위

resilient

·

2021. 5. 22. 16:59

728x90
반응형

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

 

1041번: 주사위

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

www.acmicpc.net

  • 이 문제는 처음에 문제를 잘못읽어서 엄청 쉬운문제인줄 알았다..
  • 주사위가 한 면이 보일 때, 두 면이 보일 때, 세 면이 보일 때 의 경우가 존재한다.
  • 한 면은 주어진 숫자 중에 가장 작은 원소를 골라주면되고,
  • 두 면일 때는 처음엔 combinations을 써서 경우의 수를 다 계산해줬는데 잘못된 선택이였다.
  • 두 면, 세 면일때 마주보는 면끼리는 만나지 않는다는 점을 고려해서 핵심코드를 작성했다.
  • 정답 코드아래 있는 코드는 내가 삽질 하면서 막코딩을 해본 결과이다...
import sys
input = sys.stdin.readline
n = int(input())
data = list(map(int,input().split()))
result = 0
if n ==1 :
    data.sort()
    cnt = 0 
    for i in range(5):
        result += data[i]
else:
    Min = []
    #핵심코드
    Min.append(min(data[0],data[5]))
    Min.append(min(data[1],data[4]))
    Min.append(min(data[2],data[3]))
    Min.sort()
    one = Min[0]
    two = Min[0]+Min[1]
    three = Min[0]+Min[1]+Min[2]
    result = (two)*((n-1)*4+(n-2)*4) + (three)*4 + (n-2)**2*one + 4*(n-2)*(n-1)*one
print(result)

아래코드

one = min(data)

Min = 50
three_list = [0,1,2,3,4,5]
three_list = list(combinations(three_list,3))
temp1 = []
for i in range(len(three_list)):
    if i == 2 or i == 3 or i==4 or i==6 or i==8 or i==9 or i==10 or i== 11 or i==13 or i==15 or i==16:
        continue
    else:
        temp1.append(three_list[i])
for i in temp1:
    q,w,e = i
    if Min > data[q]+ data[w] + data[e]:
        Min = data[q]+ data[w] + data[e]
three = Min

Min2 = 50
two_list = [0,1,2,3,4,5]
two_list = list(combinations(two_list,2))
temp2 = []
for i in range(len(two_list)):
    if i==4 or i == 7 or i== 9:
        continue
    else:
        temp2.append(two_list[i])
for i in temp2:
    a,b, = i
    if Min2 > data[a]+data[b]:
        Min2 = data[a]+data[b]
two = Min2 
반응형