본문 바로가기
카테고리 없음

[공통문제] 공 포장하기

by SayHiWorld 2024. 9. 13.

빨간 공 R개

초록 공 G개

파란 공 B개를 가지고 있다.

이 공들을 박스로 포장하려고 한다.

박스에는 1개, 2개, 또는 3개의 공이 들어갈 수 있다.

박스에 들어가는 공의 색은 모두 다르거나, 모두 같아야 한다. 

필요한 박스 개수의 최솟값을 구한다.

 


초기 접근

 

예를 들어 빨 4, 초 2, 파 4가 있다고 가정하자.

우선 박스의 개수가 최소가 되어야 하니, 3개짜리 박스가 많을 수록 좋다.

3개를 담아보면 빨 3, 파 3을 담아 2박스가 생기고

빨 1 초 2 파 1 이 남는다.

또, 여기서 빨초파를 하나씩 담아서 3개짜리 박스를 하나 더 만들 수 있다.

 

이때 3개짜리 박스를 무조건 많이 만드는게 유리한가에 대해 생각해볼 필요가 있다. 

그런데 박스의 개수가 적어야하니, 3개짜리가 많을 수록 유리한것이 맞다. 

 

222라면

111

111이렇게 두박스

 

123

111

012

3 1 2 

 

202

 

 

처음에 박스를 구성 조건을 무엇으로 같은색으로 잡든 다른색으로 잡든 같은것같다.

 

1. 3이상인 숫자가 있으면 거기서 3을 뺄수 없을때까지 3을 뺀다.

한번뺄때마다 박스수를 +1한다.

2. r,g,b중 하나라도 0이 나올때까지 1씩 뺀다.

한번뺄때마다 박스수를 +1한다.

3. 0이 아닌 수가 남아있다면 한 박스에 다 넣는다.

 

R, G, B = map(int, input().split())
box=0

def minusThree(r):
    while r>2:
        box+=1
        
def isZero(r):
    if r>0:
        box+=1
        
minusThree(r)
minusThree(g)
minusThree(b)

while r==0 or g==0 or b==0:
    r-=1
    g-=1
    b-=1
    box+=1

isZero(r)
isZero(g)
isZero(b)

print(box)

 

출처 : https://sbs1621.tistory.com/29

R, G, B = map(int, input().split())

#같은 색깔의 공들을 3개씩 묶어서 나오는 박스의 수 
count = R // 3 + G // 3 + B // 3

#r,g,b에 대해 한가지색 만 남아있는 경우
#두가지색이 남아있는 경우
#세가지 색이 남아 있는 경우 
#남아있지 않는 경우

while True:
	#모두 박스에 담겼을 경우
    if R % 3 == 0 and G % 3 == 0 and B % 3 == 0: 
        break
	
    #셋 다 남은 공이 있을 경우
    if R % 3 > 0 and G % 3 > 0 and B % 3 > 0:
        R -= 1
        G -= 1
        B -= 1
        count += 1
	
    #두가지 색 또는 한가지 색만 남은 경우
    #두가지색 또는 한가지색이 g,b일 경우 
    if R % 3 == 0:
    	#한가지 색 b
        if G % 3 == 0 and B % 3 != 0:
            count += 1
            break
        #한가지색 g
        if B % 3 == 0 and G % 3 != 0:
            count += 1
            break
        #두가지 색 g,b
        if G % 3 != 0 and B % 3 != 0:
            if G % 3 == 1 and B % 3 == 1:    
                count += 1
            else:
                count += 2
            break
	
    #두가지색 또는 한가지색이 r,b일 경우 
    elif G % 3 == 0:
    	#한가지색, b
        if R % 3 == 0 and B % 3 != 0:
            count += 1
            break
        #한가지색, r
        if B % 3 == 0 and R % 3 != 0:
            count += 1
            break
        #두가지 색
        if R % 3 != 0 and B % 3 != 0:
            if R % 3 == 1 and B % 3 == 1:    
                count += 1
            else:
                count += 2
            break

	#두가지색 또는 한가지색이 r,g일 경우 
    elif B % 3 == 0:
    	#한가지색 g
        if R % 3 == 0 and G % 3 != 0:
            count += 1
            break
        #한가지색 r
        if G % 3 == 0 and R % 3 != 0:
            count += 1
            break
        #두가지색 r,g
        if R % 3 != 0 and G % 3 != 0:
            if R % 3 == 1 and G % 3 == 1:    
                count += 1
            else:
                count += 2
            break

print(count)
R, G, B = map(int, input().split())

#같은 색깔의 공들을 3개씩 묶어서 나오는 박스의 수 
count = R // 3 + G // 3 + B // 3

#r,g,b에 대해 한가지색 만 남아있는 경우
#두가지색이 남아있는 경우
#세가지 색이 남아 있는 경우 
#남아있지 않는 경우

while True:
	#모두 박스에 담겼을 경우
    if R % 3 == 0 and G % 3 == 0 and B % 3 == 0: 
        break
	
    #셋 다 남은 공이 있을 경우
    if R % 3 > 0 and G % 3 > 0 and B % 3 > 0:
        R -= 1
        G -= 1
        B -= 1
        count += 1
	
    #두가지 색 또는 한가지 색만 남은 경우
    #두가지색 또는 한가지색이 g,b일 경우 
    if R % 3 == 0:
    	#한가지 색 b
        if G % 3 == 0 and B % 3 != 0:
            count += 1
            break
        #한가지색 g
        if B % 3 == 0 and G % 3 != 0:
            count += 1
            break
        #두가지 색 g,b
        if G % 3 != 0 and B % 3 != 0:
            if G % 3 == 1 and B % 3 == 1:    
                count += 1
            else:
                count += 2
            break
	
    #두가지색 또는 한가지색이 r,b일 경우 
    elif G % 3 == 0:
        #한가지색, r
        if B % 3 == 0 and R % 3 != 0:
            count += 1
            break
        #두가지 색
        if R % 3 != 0 and B % 3 != 0:
            if R % 3 == 1 and B % 3 == 1:    
                count += 1
            else:
                count += 2
            break

	#두가지색 또는 한가지색이 r,g일 경우 
    elif B % 3 == 0:
        #두가지색 r,g
        if R % 3 != 0 and G % 3 != 0:
            if R % 3 == 1 and G % 3 == 1:    
                count += 1
            else:
                count += 2
            break

print(count)