본문 바로가기

백준 코딩 테스트

백준 2251번 - 물통

728x90

출처 : 2251번: 물통 (acmicpc.net)

 

2251번: 물통

각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부

www.acmicpc.net


물통 성공분류

시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율

2 초 128 MB 8185 3941 2906 48.506%

문제

각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아부을 수 있는데, 이때에는 한 물통이 비거나, 다른 한 물통이 가득 찰 때까지 물을 부을 수 있다. 이 과정에서 손실되는 물은 없다고 가정한다.

이와 같은 과정을 거치다 보면 세 번째 물통(용량이 C인)에 담겨있는 물의 양이 변할 수도 있다. 첫 번째 물통(용량이 A인)이 비어 있을 때, 세 번째 물통(용량이 C인)에 담겨있을 수 있는 물의 양을 모두 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, C가 주어진다.

출력

첫째 줄에 공백으로 구분하여 답을 출력한다. 각 용량은 오름차순으로 정렬한다.

 


[ 문제 설명 ]

 

 

그림으로 설명하겠다.

 

그림 1 - 물통 문제 해결 아이디어
그림 2 - 물통 문제 해결 아이디어
그림 3 - 물통 문제 해결 아이디어

 


 

[ 코드 ]

 

 

from collections import deque


def fill(x, y):
    if not visited[x][y]:
        visited[x][y] = 1
        q.append((x, y))


def bfs():
    q.append((0, 0))
    visited[0][0] = 1
    while q:
        x, y = q.popleft()
        #  print(x, y)
        z = c - x - y  # z는 a, b에 의해 결정 된다.
        if x == 0:  # 조건에서 a 물통이 0일때 이므로
            answer.append(z)

            # a에서 b 물을 옮기는 경우
        if x > 0 and y < b:  # a에 물이 있고 b에 물이 가득차 있지 않을 때
            w = min(x, b - y)
            fill(x - w, y + w)
            # a에서 c
        if x > 0 and z < c:  # a에 물이 있고, c에 물이 가득차 있지 않을 때
            w = min(x, c - z)
            fill(x - w, y)

            # b에서 a
        if y > 0 and x < a:
            w = min(y, a - x)
            fill(x + w, y - w)
            # b에서 c
        if y > 0 and z < c:
            w = min(y, c - z)
            fill(x, y - w)

            # c에서 a
        if z > 0 and x < a:
            w = min(z, a - x)
            fill(x + w, y)
            # c에서 b
        if z > 0 and y < b:
            w = min(z, b - y)
            fill(x, y + w)


a, b, c = map(int, input().split())
# visited: a 물통과 b 물통의 양에 따라 c 물통의 양이 정해지기 때문에
# a,b 두 통을 실행한 적이 있는지 확인하는 2중리스트
visited = [[0] * (b + 1) for _ in range(a + 1)]
# 답을 넣을 배열
answer = []
# BFS
q = deque()
bfs()
# 답 출력
answer.sort()
print(' '.join(list(map(str, answer))))

 


후기

 

역시 복습을 할 때마다 느끼지만

처음 학습할 때는 확실하게 덜 이해가 된 거 같다는 느낌을

팍팍 받는다.

같은 이해라도 깊이가 다르달까..?

728x90

'백준 코딩 테스트' 카테고리의 다른 글

백준 3108번 - 로고  (0) 2021.04.12
백준 2186번 - 문자판  (0) 2021.04.12
백준 1525번 - 퍼즐  (0) 2021.04.11
백준 9019번 - DSLR  (0) 2021.04.10
백준 1963번 - 소수 경로  (0) 2021.04.10