https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
문제)
풀이)
n이 1개부터 4개까지 그림을 그려가면서 해결해 보려 했는데 규칙성을 발견하지 못하고 헤맸던 문제이다.
그래서 한참을 고민ㅠㅠ
이 문제를 풀기 위해서는 크게 3가지 단계로 이루어진다.
- 정육면체에서 한 주사위당 보일 수 있는 면의 개수는 1, 2, 3 중 하나임을 파악한다.
- 보이는 면의 개수당 해당 주사위의 개수를 구하는 규칙성을 찾는다.
- 주사위에서 마주보는 면을 제외하고 나머지는 모두 인접하다. 이를 이용해 보이는 면에 해당하는 최소 값을 구한다.
1 단계: 정육면체에서 한 주사위당 보이는 면의 개수
주사위를 정육면체로 쌓아 올렸을 때, 바깥쪽에 보이는 주사위의 면의 개수는 총 3가지다.
3개: 가장 쉽게 생각해 볼 수 있는 것으로 맨 상단(뚜껑)에 존재하는 가장 끝의 4개는 3개의 면이 보인다.
2개: 모서리 쪽에 위치한 부분 4세트 + 상단에 위치한 부분 4세트
1개: 상단의 가운데 부분 + 나머지 4면에서 가운데 부분
2 단계: 주사위 개수 구하는 규칙성 찾기
해당 그림은 4*4*4 짜리 정육면체를 그려보았다.
쓰여 있는 숫자는 해당 주사위가 보이는 면의 개수이고, 2개의 면이 보이는 곳은 초록색 형광표시했다.(2개짜리 개수 구하기 편하려고!)
- 3개: 맨 상단 4개 => 4
- 2개: 모서리 쪽에 위치한 부분(N-1) 4세트 + 맨 상단(N-2) 4세트 => 4(N-2) + 4(N-1)
- 1개: 상단 가운데: (N-2)*(N-2) + 4면 가운데: (N-2)*(N-1) => (N-2)*(N-2) +4(N-2)*(N-1)
3 단계: 면의 최소값 구하기
주사위는 6면으로 마주보는 쌍을 구하면 3쌍이다.
이 3쌍 중에서 가장 작은 수를 각각 저장하면 6개 중 3개가 저장된다.
이를 오름차순으로 정렬후, 3면이 보이는 것은 3개를 모두 더한 것, 2면이 보이는 것은 앞에서부터 2개를 더한 것, 1면이 보이는 것은 제일 처음 부분을 사용하면 된다.
그 후 각 면이 보이는 주사위 개수별로 곱해준 후 모두 더한 후 출력하면 문제가 해결된다.
n = int(input())
dice = list(map(int, input().split()))
# 1, 2, 3면이 보이는 주사위 개수 세기
side1 = 4*(n-2)*(n-1) + (n-2)**2
side2 = 4*(n-2) + 4*(n-1)
side3 = 4
# 주사위에서 마주보는 면 중 작은 것 저장하는 리스트
min_li = []
if n == 1:
print(sum(dice) - max(dice))
else:
# 주사위의 마주보는 면을 쌍으로 만들고 그 중 작은 애 뽑아 저장
# (마주 보는 애는 인접하지 않으므로 동시에 보일 수 없음)
min_li.append(min(dice[0], dice[5]))
min_li.append(min(dice[1], dice[4]))
min_li.append(min(dice[2], dice[3]))
min_li.sort()
min1 = side1 * min_li[0]
min2 = side2 * (min_li[0] + min_li[1])
min3 = side3 * (min_li[0] + min_li[1] + min_li[2])
s = min1 + min2 + min3
print(s)
'코테 > greedy' 카테고리의 다른 글
[Greedy] 1이 될 때까지 (0) | 2022.03.14 |
---|---|
[Greedy] 숫자 카드 게임 (0) | 2022.03.13 |
[Greedy] 큰 수의 법칙 (0) | 2022.03.04 |
[Greedy] 거스름돈 (0) | 2022.03.04 |