1 분 소요

사용 언어: Python3

문제

백준 16769

스크린샷 2023-03-28 오후 8 49 12
스크린샷 2023-03-28 오후 8 49 26

문제가 영어로 되어있다. 간단히 설명하자면,
3개의 bucket이 존재하고 각각의 bucket은 capacity(용량)와 milk(담긴 우유량)로 구성되어 있다.

하나의 bucket에서 다른 bucket으로 우유를 붓는 행동을 100번 했을 때,
각 bucket에 담긴 우유량(milk)을 구하는 문제이다.

다만 우유를 붓는 순서는 1번 -> 2번, 2번 -> 3번, 3번 -> 1번의 순서이고,
출발 bucket의 우유량이 empty가 되거나, 도착 bucket의 우유량이 full이 될 때까지 붓는다.

When Farmer John pours from bucket `a` into bucket `b`,
he pours as much milk as possible until either bucket `a` becomes empty or bucket `b` becomes full.

코드

내 풀이

# 버킷 a -> 버킷 b 로 우유를 붓는데,
# 버킷 a가 empty 이거나 버킷 b가 full이 될때까지

def pourMilk(srcBuck, destBuck):
  pourAmount = min(srcBuck[1], destBuck[0]-destBuck[1])
  srcBuck[1] -= pourAmount
  destBuck[1] += pourAmount

# input
# 각 버킷마다 용량(capacity), 담긴양(milk)
bucket1 = list(map(int, input().split()))
bucket2 = list(map(int, input().split()))
bucket3 = list(map(int, input().split()))

for _ in range(33):
  pourMilk(bucket1, bucket2)
  pourMilk(bucket2, bucket3)
  pourMilk(bucket3, bucket1)

pourMilk(bucket1, bucket2)

# output
# 100번 붓고 각각 버킷에 남은 우유
print(bucket1[1])
print(bucket2[1])
print(bucket3[1])

다른 풀이

# 용량과 우유를 따로 관리하는 배열
capacity, milk = [0, 0, 0], [0, 0, 0]
# capacity, milk = list(), list()

# input
for i in range(3):
  capacity[i], milk[i] = map(int, input().split())

for i in range(100):
  src = i % 3 # 출발지 인덱스
  dest = (i+1) % 3 # 목적지 인덱스 # (0 -> 1 -> 2 -> 0 -> ...) 처럼 회전하기 위해서 %3
  
  pourAmount = min(milk[src], capacity[dest]-milk[dest])

  milk[src] -= pourAmount
  milk[dest] += pourAmount

# output
for x in milk:
  print(x)
  • capacitymilk을 분리하여 관리한다.
    • 코드가 길어진다는 단점이 있지만 직관적이라는 장점이 있다.

또 다른 풀이

# 용량과 우유를 함께 관리하는 dict
bucket = {}

# input
for i in range(3):
  c, m = map(int, input().split())
  bucket[i] = [c, m]  # list
  # bucket[i][0]: capacity
  # bucket[i][1]: milk

# 0 -> 1 -> 2 -> 0 -> ...
for i in range(100):
  src = i % 3
  dest = (i+1) % 3

  pourAmount = min(bucket[src][1], bucket[dest][0] - bucket[dest][1])

  bucket[src][1] -= pourAmount # 출발지 bucket의 milk
  bucket[dest][1] += pourAmount # 목적지 bucket의 milk

# output
for x in bucket.values():
  print(x[1])
  • capacitymilk을 분리하지 않고 하나의 bucket으로 관리할 수도 있다.
    • 코드가 간결해진다는 장점이 있지만 직관적이지 않다는 단점이 있다.


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기