Beakjoon 12981, 공 포장하기
solved.ac Silver5
Greedy 알고리즘
문제
빨간 공 R개, 초록 공 G개, 파란 공 B개를 가지고 있다.
오늘은 이 공을 박스로 포장하려고 한다. 박스에는 공이 1개, 2개, 또는 3개 들어갈 수 있다.
박스에 들어가는 공의 색은 모두 다르거나, 모두 같아야 한다.
필요한 박스 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 R, G, B가 주어진다. (1 ≤ R, G, B ≤ 100)
출력
첫째 줄에 필요한 박스 개수의 최솟값을 출력한다.
Solution
R, G, B = map(int, input().split())
count = R // 3 + G // 3 + B // 3
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
if R % 3 == 0:
if G % 3 == 0 and B % 3 != 0:
count += 1
break
if B % 3 == 0 and G % 3 != 0:
count += 1
break
if G % 3 != 0 and B % 3 != 0:
if G % 3 == 1 and B % 3 == 1:
count += 1
else:
count += 2
break
elif G % 3 == 0:
if R % 3 == 0 and B % 3 != 0:
count += 1
break
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
elif B % 3 == 0:
if R % 3 == 0 and G % 3 != 0:
count += 1
break
if G % 3 == 0 and R % 3 != 0:
count += 1
break
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 세 값을 입력받고 그 수를 3으로 나눈 몫과 나머지를 구합니다. 모든 몫은 count에 더해주고 나머지를 비교하여 count에 더해줍니다.
- R, G, B
세 값의 나머지가 모두 0보다 큰 경우
한 상자에 한 개씩 담아 R, G, B - 1을 한 다음 count를 하나 추가하는 것을 반복합니다. 셋 중 하나의 나머지가 0일 경우
두 수를 비교하여 나머지가 1, 1 인경우 같은 상자에 담아 상자의 수를 최소로 하고 그렇지 않은 경우에는 같은 상자에 담지 못하기 때문에 서로 다른 상자에 담아줍니다.셋 중 두 개의 나머지가 0일 경우
한 상자에 담아줍니다.