2251 물통

hey hey·2021년 12월 11일
0

알고리즘

목록 보기
2/57
post-thumbnail

문제

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

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

입력

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

출력

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

풀이

a,b,c 중에 물이 남아있는 곳이 있다면, 다른 곳으로 붓는다.
그 결과가 이전의 결과값에 포함 되어 있다면 무시하고,
이전의 결과값에 없다면, 붓고, 그 값으로 새로운 dfs가 시작된다

import sys
input = sys.stdin.readline

Acase,Bcase,Ccase = map(int,input().split())  # 케이스의 크기를 입력 받는다



result = [[0,0,Ccase]]            # 나올수 있는 모든 결과값

# 시작 0,0,10
def dfs(a,b,c):
    if a > 0:               # acase 에 물이 남아있는 경우
        # bcase 로 붓는데 ,
        if a+b< Bcase:      # 두 통의 물의 합이 bcase보다 작다면?
                            # [0, a+b , c] (a에서 b로 그냥 따르기, c는 그대로)
            if [0,a+b,c] not in result:    # 결과값에 없다면?
                result.append([0,a+b,c])   # 결과값  추가 + 새로운 dfs 시작
                dfs(0,a+b,c)
        else:               # 두 통의 물의 합이 bcase보다 크다?
                            # [(물의합 - B통 크기), B통 크기, c ]
                            # -> [(a+b)-Bcase,Bcase,c]
            if [(a+b)-Bcase,Bcase,c] not in result:
                result.append([(a+b)-Bcase,Bcase,c])
                dfs((a+b)-Bcase,Bcase,c)

        if a+c< Ccase:
            if [0, b, a+c] not in result:
                result.append([0, b, a+c])
                dfs(0, b, a+c)
        else:
            if [(a + c) - Ccase, b, Ccase] not in result:
                result.append([(a + c) - Ccase, b, Ccase])
                dfs((a + c) - Ccase, b, Ccase)

    if b > 0:
        if a + b < Acase:
            if [a + b,0, c] not in result:
                result.append([a + b,0, c])
                dfs(a + b,0, c)
        else:
            if [Acase, (a + b) - Acase, c] not in result:
                result.append([Acase, (a + b) - Acase, c])
                dfs(Acase, (a + b) - Acase, c)

        if b + c < Ccase:
            if [a, 0, b + c] not in result:
                result.append([a, 0, b + c])
                dfs(a, 0, b + c)
        else:
            if [a,b+c-Ccase ,Ccase] not in result:
                result.append([a,b+c-Ccase ,Ccase])
                dfs(a,b+c-Ccase ,Ccase)

    if c > 0:
        if a + c < Acase:
            if [a+c,b, 0] not in result:
                result.append([a+c,b, 0])
                dfs(a+c , b, 0)
        else:
            if [Acase,b,a+c-Acase] not in result:
                result.append([Acase,b,a+c-Acase])
                dfs(Acase,b,a+c-Acase)

        if b + c < Bcase:
            if [a, b+c,0 ] not in result:
                result.append([a, b+c,0 ])
                dfs(a, b+c,0 )
        else:

            if [a, Bcase, b+c-Bcase] not in result:
                result.append([a, Bcase, b+c-Bcase])
                dfs(a, Bcase, b+c-Bcase)



dfs(0, 0, Ccase)
final = []
# 나올 수 있는 모든 값
# [0, 0, 10], [8, 0, 2], [0, 8, 2], [2, 8, 0]
# [1, 9, 0],  [0, 9, 1], [8, 1, 1], [0, 1, 9]
# [1, 0, 9],  [8, 2, 0], [0, 2, 8], [2, 0, 8]
for i in result:
    if i[0]==0:             # A가 비어있을 때
        final.append(i[2])  # C값 넣어주기
print(*sorted(final))       # 정렬하기


profile
FE - devp

0개의 댓글