Python/백준 (BOJ)

[BOJ][B2]맥주 냉장고 - 3595

ㅋㅋ! 2025. 9. 29. 13:00

 

https://www.acmicpc.net/problem/3595

문제 전문은 링크 참조

문제가공

  1. 입력값 n을 받는다
  2. n개의 맥주캔을 직사각형 형태로 적재할때, 겉넓이가 가장 작은 x,y,z 축 값을 출력하자.

코드작성

  1. 3개로 이루어진 n의 약수 목록을 구한다.
    • 2개로 이루어진 약수를 먼저 구하고, 약수의 약수를 구하는 식으로 3개로 이루어진 약수를 구한다.
  2. 겉넓이 공식 = ((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