📝 문제
💡 오늘 아침 은주는 팬케익을 만들었다.
자 이제 신혜는 이 팬케익을 먹으려고 한다.
은주가 만든 팬케익은 박스 모양이고, 가로 Acm, 세로 Bcm, 높이 Ccm 크기이다.
신혜는 팬케익을 D번 먹으려고 한다.
매번 신혜가 팬케익을 먹으려고 할 때, 은주는 팬케익을 변에 평행하게 자른 후에 신혜에게 준다.
은주는 뛰어난 요리사이기 때문에, 자르는 케익은 모두 두께가 1cm이다.
원래 은주는 팬케익을 다 먹으려고 했으나, 어쩔수 없이 신혜에게 주는 것이다.
따라서, 최대한 많은 양을 남기려고 한다.
신혜가 팬케익을 D번 먹은 후에 남은 케익의 양은 은주가 케익을 자르는 방법에 따라서 달라지게 된다.
A, B, C, D가 주어졌을 때, 신헤가 팬케익을 D번 먹은 후에 남은 팬케익 부피의 가능한 최댓값을 구하시오.
⚙️ 입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 빈 줄로 구분되며, 다음과 같이 구성되어 있다.
테스트 케이스의 첫째 줄에 A, B, C, D가 주어진다.
⚙️ 출력 : 각 테스트 케이스에 대해
은주가 남길 수 있는 팬케익의 최대 부피를 차례대로 한 줄에 하나씩 출력한다.
이 부피는 부호있는 64비트 정수 범위 안에 들어온다.
2545번: 팬케익 먹기
두 번째 테스트 케이스를 보자. 왜 정답이 64일까? 가장 먼저 4 * 5 변에 맞춰서 2번 팬케익을 자르면 남은 팬케익은 4*5*4가 된다. 그 다음에 4 * 4 변에 맞추어 팬케익을 자르면 4*4*4가 된다. 따라서 6
www.acmicpc.net
✅ 풀이
t = int(input())
for i in range(t):
input()
a, b, c, d = map(int, input().split())
li = [a,b,c]
li.sort()
small = li[0]
mid = li[1]
big = li[2]
if big - mid >= d:
print((big - d) * mid * small)
elif big + mid - 2 * small >= d:
if (big + mid - d) % 2 == 0:
print(small * (((big + mid - d) // 2) ** 2))
else:
print(small * ((big + mid - d) // 2) * (((big + mid - d) // 2) + 1))
else:
cnt = d
cnt -= (big - small)
cnt -= (mid - small)
if cnt % 3 == 0:
print((small - (cnt // 3)) ** 3)
elif cnt % 3 == 1:
print(((small - (cnt // 3)) ** 2) * (small - (cnt // 3) - 1))
else:
print(((small - (cnt // 3)) * ((small - (cnt // 3) - 1)) ** 2))
💡 경우를 다양하게 나누어 풀었다.
첫째로, 팬케익의 가장 큰 방향에서 다 자를 수 있는 경우는
(나머지 두 방향의 길이 * 자른 뒤 남은 방향의 길이)로 구할 수 있다.
둘째로, 팬케익의 가장 작은 방향을 제외한 두 방향에서 골고루 잘라야 하는 경우는
잘라야 할 횟수가 홀수일 때와 짝수일 때를 각각 고려하여 구할 수 있다.
마지막으로, 팬케익의 세 방향을 모두 잘라야 하는 경우는
우선 세 방향의 크기를 모두 같게 잘라준 다음 남은 횟수에 따라 나눴다.
시간 제한을 피하려 하다 보니 고려할 사항이 너무 많아서 복잡하다고 느꼈다.