ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeTree/Python] 용량이 다른 3개의 물통
    Solve 2024. 6. 26. 00:50

    문제

    더보기

    용량이 다른 3개의 물통

    물을 담을 수 있고 각각 용량이 다른 물통 3개가 있습니다. 각 물통마다 담을 수 있는 최대 용량과 원래 담겨 있던 물의 양이 주어지고, 1번 물통에서 2번 물통으로, 2번 물통에서 3번 물통으로, 3번 물통에서 다시 1번 물통으로 내용물을 옮겨 담는 작업을 100번 진행했을 때, 각 물통에 들어있는 내용물의 양을 구하는 프로그램을 작성해보세요.

     

    입력 형식

    3개의 줄에 걸쳐 한 줄에 하나씩 각 물통의 용량과 물통에 들어있던 내용물이 공백을 사이에 두고 주어집니다.

    • 1 ≤ 물의 용량 ≤ 1,000,000,000

    출력 형식

    1 → 2, 2 → 3, 3 → 1 순서로 옮겨담는 작업을 100번 반복한 이후의 결과를 3개의 줄에 걸쳐 출력합니다.

    첫 번째 줄에는 1번 물통에 남아있는 물의 양을 출력합니다.

    두 번째 줄에는 2번 물통에 남아있는 물의 양을 출력합니다.

    세 번째 줄에는 3번 물통에 남아있는 물의 양을 출력합니다.

     

    코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

    국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

    www.codetree.ai

     

    풀이

    storage = []
    water = []
    count = 0
    
    for _ in range(3):
        s, w = map(int, input().split())
        storage.append(s)
        water.append(w)
    
    # 1 → 2, 2 → 3, 3 → 1 순서로 물을 옮기는 작업을 100번 반복
    while (True):
        # 1번 물통에서 2번 물통으로 물 옮기기
        if water[0] + water[1] >= storage[1]:
            move = storage[1] - water[1]
        else:
            move = water[0]
        water[0] -= move
        water[1] += move
        count += 1
        if count == 100:
            break
    
        # 2번 물통에서 3번 물통으로 물 옮기기
        if water[1] + water[2] >= storage[2]:
            move = storage[2] - water[2]
        else:
            move = water[1]
        water[1] -= move
        water[2] += move
        count += 1
        if count == 100:
            break
    
        # 3번 물통에서 1번 물통으로 물 옮기기
        if water[2] + water[0] >= storage[0]:
            move = storage[0] - water[0]
        else:
            move = water[2]
        water[2] -= move
        water[0] += move
        count += 1
        if count == 100:
            break
        
    # 결과 출력
    print(water[0])
    print(water[1])
    print(water[2])

        생각나는 대로 짰더니 엄청 너저분하게 짠 것 같다. (맞았으니 됐다) 100회 반복인데 암만 풀어도 맞게 푼 것 같은데 정답이 안 나와서 너무너무 화났는데 토론 탭 들어가니 비슷한 문제로 고민 중인 사람이 있었다. "1->2, 2->3, 3->1" 한 세트를 100회 반복하는 건 줄 알았더니만 "1->2" 이 각각의 작업을 1회차로 보는 거였다.

        구현에 대한 내용은 보면 알 것 같아서 패스합니당.. 각각 작업마다 카운트를 걸어주고 100이 되는 순간 반복문을 빠져나오게 했다.