
https://www.acmicpc.net/problem/3595
문제 전문은 링크 참조
문제가공
- 입력값 n을 받는다
- n개의 맥주캔을 직사각형 형태로 적재할때, 겉넓이가 가장 작은 x,y,z 축 값을 출력하자.
코드작성
- 3개로 이루어진 n의 약수 목록을 구한다.
- 2개로 이루어진 약수를 먼저 구하고, 약수의 약수를 구하는 식으로 3개로 이루어진 약수를 구한다.
- 겉넓이 공식 = ((xy ) + (yz) + (x*z)) * 2
- 겉넓이를 구하지않고 x,y,z간의 차이값이 최소힌 항을 구해도 된다.
def getDiv(n): # 약수구하기
arr = []
for i in range(1,int(n**0.5)+1):
if n% i == 0 : arr.append(i)
return arr
def getSurface(arr): # x,y,z의 겉넓이 구하기
result = {}
for i in arr:
a,b,c = i[0],i[1],i[2]
answer = ((a*b)+(b*c)+(a*c))*2
result[(a,b,c)]= answer
return result
def gap(dic): #x,y,z의 gap 구하기
result = {}
for i in dic:
result[tuple(i)] = abs(i[0]-i[1])+abs(i[1]-i[2])
return result
n = int(input())
first_div = []
lst = []
first_div.extend(getDiv(n))
answer ={}
for i in first_div:
a = i
b = n//a
c_list = getDiv(b)
lst.extend([[a,j,int(b//j)] for j in c_list])
c_list2= getDiv(a)
lst.extend([[j,b,int(a//j)] for j in c_list2])
#answer=getSurface(lst)
answer = gap(lst)
#print(*arr)
#print(answer)
print(*min(answer,key=answer.get))
#print(*min(answer, key=answer.get))'Python > 백준 (BOJ)' 카테고리의 다른 글
| [BOJ][B2]애너그램 거리 - 3778 (0) | 2025.10.01 |
|---|---|
| [BOJ][B2]iChess - 3602 (0) | 2025.09.30 |
| [BOJ][B2]Adding Reversed Numbers - 3486 (0) | 2025.09.28 |
| [BOJ][B2]Vigenère Cipher Encryption - 3417 (0) | 2025.09.27 |
| [BOJ][B2]LUKA - 3234 (0) | 2025.09.26 |