[2251] 물의 양 구하기 (물통, BFS)

2023. 4. 13. 21:40·Coding Test/Graph
728x90
 

2251번: 물통

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

www.acmicpc.net

 

분석 (BFS 과정)

1. 노드에서 갈 수 있는 6개의 경우(A→B, A→C, B→A, B→C, C→A, C→B)에 관해 다음 노드로 정해 큐에 추가

    A,B,C 무게가 동일한 노드에 방문한 이력이 있을 때는 큐에 추가하지 않음

2. 보내는 물통의 모든 용량을 받는 물통에 저장하고, 보내는 물통에는 0을 저장

     단, 받는 물통이 넘칠 때는 초과하는 값만큼 보내는 물통에 남김

3. 큐에 추가하는 시점에 1번째 물통(A)의 무게가 0일 때가 있으면 3번째 물통(C)의 값을 정답 리스트에 추가

 

풀이

from collections import deque

# 두 리스트를 이용하여 6가지 이동 케이스를 간편하게 정의할 수 있음
# 0,1,2는 각각 A,B,C 물통
Sender=[0,0,1,1,2,2]
Receiver=[1,2,0,2,0,1]
# a→b, a→c, b→a, b→c, c→a, c→b

# 부피 A,B,C(1~200) 값 저장
now =list(map(int,input().split()))
# 방문 여부 저장 리스트
visited=[[False for j in range(201)] for i in range(201)]
# 정답 리스트 (A 0 일때 C에 담길 수 있는 물의 양 리스트)
answer=[False]*201
# print(now)

def bfs():
    queue=deque()
    # Sender[0]:0, Receiver[0]:1 A->B를 뜻함
    queue.append((0,0))

    visited[0][0]=True
    # 처음 앞 두 물통은 비어있고, 3번째 물통은 가득 차 있다
    answer[now[2]]=True

    while queue:
        nowNode=queue.popleft()
        # print(nowNode)

        A=nowNode[0]
        B=nowNode[1]
        C=now[2]-A-B # C는 전체 물의 양에서 A와 B를 뺀 것

        for k in range(6):
            next=[A,B,C]
            next[Receiver[k]]+=next[Sender[k]]
            next[Sender[k]]=0

            # 물이 넘칠때
            if next[Receiver[k]] > now[Receiver[k]]:
                # 초과하는 만큼 다시이전 물통에 넣어주기
                next[Sender[k]]=next[Receiver[k]]-now[Receiver[k]]
                next[Receiver[k]]=now[Receiver[k]] # 대상 물통 최대로 채우기

            # A와 B의 물의 양으로 방문 리스트 체크
            if not visited[next[0]][next[1]]:
                visited[next[0]][next[1]]=True
                queue.append((next[0], next[1]))

                # A의 물의 양이 0일때 C의 물의 무게를 정답 변수에 저장
                if next[0]==0:
                    answer[next[2]]=True

bfs()

for i in range(len(answer)):
    if answer[i]:
        print(i, end= " ")

 

 

 

728x90
저작자표시 (새창열림)
'Coding Test/Graph' 카테고리의 다른 글
  • [1043] 거짓말 (유니온파인드)
  • [1976] 여행 가자(여행 계획, 유니온 파인드)
  • [1707] 이분 그래프(DFS)
  • [1325] 효율적인 해킹(BFS)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    트리
    재귀
    LIS
    DP
    구현
    조합
    알고리즘
    덱
    백준
    Algorithm
    동적계획법
    그래프
    정렬
    BFS
    플로이드워셜
    힙
    큐
    이분탐색
    프로그래머스
    구간합
    그리디
    최대공약수
    DFS
    월간코드챌린지
    다익스트라
    파이썬
    스택
    자료구조
    최소신장트리
    최단거리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[2251] 물의 양 구하기 (물통, BFS)
상단으로

티스토리툴바