Data Structures & Algorithms

[Algorithms] 깊이/넓이 우선 탐색 (DFS, BFS) 활용-양팔저울(DFS)

숄구-ml 2022. 5. 28. 15:46

 

  • 일단 물 그릇과 추가 양팔 저울 상에서 균형을 유지해야 한다는 것을 생각해야 한다 
  • 그리고 물 그릇을 오른쪽에 고정한다고 가정하고 추는 왼쪽, 오른쪽, 혹은 아예 놓지 않는 3가지의 경우를 생각하여 물그릇에 물을 얼만큼 채워야 균형을 유지할지 고려하면 된다.

 

 

 

 

 

    • 여기서 이제 주의해야 할 것은 물의 무게가 마이너스가 되는 경우는 문제에서 고려하지 않고 - 따라서 물의 무게가 플러스일 때만 고려했다
    • 결과가 되는 물의 무게가 중복 될 수 있다는 것을 고려해야 한다 - 따라서 자료형 Set을 사용했다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def DFS(level, sum):
 
    if level == n:
        if sum > 0:
           res.add(sum) # 물의 무게가 마이너스인 경우는 제외
    else:
        DFS(level+1, sum+weights[level])    # 추를 왼쪽에 놓는 경우
        DFS(level+1, sum-weights[level])    # 추를 오른쪽에 놓는 경우
        DFS(level+1, sum)                   # 추를 놓지 않는 경우
 
if __name__ == '__main__':
 
    n = int(input())
    weights = list(map(int, input().split()))
    water = sum(weights)
 
    res = set()
    DFS(00)
    print(water - len(res))     # 물의 무게의 개수에서 위에서 계산되서 나온 물의 무게의 개수의 차를 print 해줬다
cs
 
   
728x90