프로그래밍/문제풀이
[Python] 백준 1041 주사위
성수동이민기
2022. 8. 1. 00:43
https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
# 1041 주사위
N = int(input())
numbers = list(map(int, input().split()))
if N == 1:
numbers.sort()
print(sum(numbers[:-1]))
else:
minimum3 = min(numbers[0] + numbers[3] + numbers[4], numbers[0] + numbers[2] + numbers[4], numbers[0] + numbers[1] + numbers[2],
numbers[0] + numbers[1] + numbers[3], numbers[5] + numbers[3] + numbers[4], numbers[5] + numbers[2] + numbers[4],
numbers[5] + numbers[1] + numbers[2], numbers[5] + numbers[1] + numbers[3])
minimum2 = min(numbers[0] + numbers[1], numbers[0] + numbers[2], numbers[0] + numbers[3], numbers[0] + numbers[4],
numbers[5] + numbers[1], numbers[5] + numbers[2], numbers[5] + numbers[3], numbers[5] + numbers[4],
numbers[1] + numbers[2], numbers[2] + numbers[4], numbers[4] + numbers[3], numbers[3] + numbers[1])
minimum1 = min(numbers)
if N == 2:
print(minimum3 * 4 + minimum2 * 4)
else:
top = minimum3 * 4 + minimum2 * (4 * N - 8) + minimum1 * (N ** 2 - 4 * N + 4)
mid = (N - 1) * (minimum2 * 4 + minimum1 * (4 * N - 8))
print(top + mid)
문제 조건을 모두 공책에 적어보고, 법칙을 발견하여 그대로 구현하였다.
세 면이 보이는 경우를 minimum3, 두 면이 보이는 경우를 minimum2, 한 면만 보이는 경우를 minimum1로 두었다.
각자의 경우 중 최솟값을 가지는 경우를 계산했다.
맨 처음에 minimum2를 구현할 때, 제일 작은 두 개를 가져다 썼다. 제출 결과 틀렸다는 안내를 받았다.
이내 제일 작은 두 개가 서로 마주보는 경우가 있을 수 있음을 깨닫고 알고리즘을 고쳤다.
하단의 if N == 2는 쓸모없는 조건이란 것을 깨닫고, 이를 지워서 제출했을 때에도 정답 판정을 받았다.
위의 제출이 (1052B) if문을 지워서 제출한 결과이다.