[BOJ] 1041번 - 주사위

sunnny·2023년 8월 4일
0

BOJ

목록 보기
4/8

🐣 처음 생각한 풀이

"최솟값을 출력하는 프로그램을 작성하시오."를 보고
단순히 주사위 숫자들을 정렬한 후, 그중 가장 작은 수 3개만을 이용해서 총합을 계산하는 코드를 작성하였다.

import sys
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
arr.sort()
total = 0
if N == 1:
    total = sum(arr)-arr[-1]
else:
    total = arr[2]*4 + arr[1]*(2*N-2)*4 + arr[0]*(5*N*N-8*N+4)
print(total)

🦊 참고한 자료, 바뀐풀이

100% 맞을줄 알았는데,, ㅠ_ㅠ

  • 틀린 이유는 주사위의 성질 때문이었는데, 최솟값 A를 사용한다면 그 반대편에 있는 F는 사용할 수 없다!!!

  • 참고 : A-F // B-E // C-D 이렇게 마주보는데 마주보는 수들은 리스트에서 인덱스 합이 5였다. A(0)-F(5) // B(1)-E(4) // C(2)-D(3)

  1. 그래서 처음에는, 최솟값 A와 마주보고 있는 F 빼고는 다 사용할 수 있는 거니까, del arr[5-arr.index(min(arr))] 를 사용했는데, 이 코드의 문제점은 min(arr)와 같은 수가 여러개가 있어도 그중에서 인덱스가 가장 작은 숫자를 가져온다는 문제가 있었다,,

  2. 도저히 모르겠어서 아래 블로그를 참고했다.

  • https://kkk4872.tistory.com/130
  • 처음에는 아래의 정답 코드에서 arr.append() 가 사용되는 3줄을 이해하지 못했는데, 계속 생각해 보니까 '마주보는 숫자들 중 한 개의 숫자만 사용할 수 있다!' 는 주사위의 법칙을 모든 면에 적용한 풀이였다. (천채,,🫢)

🐯 정답코드

import sys
input = sys.stdin.readline
N = int(input())
tmp = list(map(int, input().split()))
if N == 1:
    total = sum(tmp)-max(tmp)
else:
    arr=[]
    arr.append(min(tmp[0], tmp[5]))
    arr.append(min(tmp[1], tmp[4]))
    arr.append(min(tmp[2], tmp[3]))
    arr.sort()
    total = arr[2]*4 + arr[1]*(2*N-2)*4 + arr[0]*(5*N*N-8*N+4)
print(total)

🦁 후기

앞으로 주사위 관련 문제가 나오면 이 문제의 풀이에 사용된 주사위의 성질을 처음부터 고려하면 풀어야겠다!!

0개의 댓글