새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2251 물통

by 언호 2022. 6. 15.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 접근 및 이해

각 바구니로 물을 이동시킬 때, 물을 최대한 많이 옮겨야했습니다.

A->B, A->C, B->A, B->C, C->A, C->B 로 물을 옮기도록 하는데, 두 바구니를 비교하여 이동가능한 물의 양을 구하여 이동시켰습니다.

탐색 여부를 확인하는 딕셔너리 변수를 이용하여 중복 탐색을 방지하였습니다.

딕셔너리 변수의 키 값으로는 (A바구니 물의 양, B바구니 물의 양)으로 지정하였습니다.

2) 알고리즘

  • BFS

3) 풀이 코드

사용 언어 - Python

import sys
from collections import deque
sys.stdin = open('input.txt')

def solution():
    q = deque([(0, 0)])                 # 처음 A, B 물통은 비어있음

    while q:
        a, b = q.popleft()              # 현재 A, B 바구니 물의 양
        c = C - a - b                   # C 바구니 물의 양

        if not a:                       # A 바구니가 비어있다면, 정답에 추가
            answer.add(c)
        
        for element in [(a + min(c, A-a), b), (a, b + min(c, B-b)),         # C -> A, C -> B 바구니로 물을 옮김
            (a + min(b, A-a), b - min(b, A-a)), (a, b - min(b, C-c)),       # B -> A, B -> C 바구니로 물을 옮김
            (a - min(a, B-b), b + min(a, B-b)), (a - min(a, C-c), b)]:      # A -> B, A -> C 바구니로 물을 옮김
            
            if not visited.get((element[0], element[1]), False):            # A 바구니와 B 바구니에 남은 물의 양을 탐색하지 않았으면
                visited[(element[0], element[1])] = True                    # 탐색 처리
                q.append((element[0], element[1]))                          # 큐에 추가
        
A, B, C = map(int, sys.stdin.readline().split())        # 물통의 최대양
answer = set()                                          # 정답의 집합
visited = {}                                            # A, B 물통에 현재 담겨있는 물의 양을 탐색했는지 여부

solution()

print(*sorted(answer))              # 오름차순 출력

🔗 문제 링크

- https://www.acmicpc.net/problem/2251

 

2251번: 물통

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

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1937 욕심쟁이 판다  (0) 2022.06.17
[백준] 2668 숫자고르기  (0) 2022.06.16
[백준] 13023 ABCDE  (0) 2022.06.14
[백준] 10282 해킹  (0) 2022.06.12
[백준] 1507 궁금한 민호  (0) 2022.06.11

댓글