728x90
물통 성공분류
시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 | 128 MB | 8185 | 3941 | 2906 | 48.506% |
문제
각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아부을 수 있는데, 이때에는 한 물통이 비거나, 다른 한 물통이 가득 찰 때까지 물을 부을 수 있다. 이 과정에서 손실되는 물은 없다고 가정한다.
이와 같은 과정을 거치다 보면 세 번째 물통(용량이 C인)에 담겨있는 물의 양이 변할 수도 있다. 첫 번째 물통(용량이 A인)이 비어 있을 때, 세 번째 물통(용량이 C인)에 담겨있을 수 있는 물의 양을 모두 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, C가 주어진다.
출력
첫째 줄에 공백으로 구분하여 답을 출력한다. 각 용량은 오름차순으로 정렬한다.
[ 문제 설명 ]
그림으로 설명하겠다.
[ 코드 ]
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 |