본문 바로가기

Note..

water jug problem

눈금이 없는 두 물주머니 A, B가 있다.

A물주머니는 3gallon 이고 B물주머니는 5gallon이다.

물은 무한정 제공될 때 4gallon을 만들어라

 

 

1. production rule 을 세워 해결하는 방법

A, B 물주머니에 들어있는 물의 양을 (x,y)로 표현할 때, 생성식을 세운 후 최종상태를 탐색하는 방법으로 해결할 수 있다.

생성식은,

1) (x,y) if x<3 then (3,y); //fill the 3gallon jug

2) (x,y) if y<5 then (x,5); //fill the 5gallon jug

3) (x,y) if x+y >= 3 and y>0 then (3, y-(3-x)); //pour water from 5gallon jug into 3gallon jug until the 3gallon jug is full.

4) (x,y) if x+y >=5 and x>0 then (x-(5-y), 5); //pour water from 3gallon jug into 5gallon jug until the 5gallon jug is full.

...

와 같이 가능한 상황들(다음 상태를 생성해낼 수 있는 식들)을 세운 후 상태탐색을 진행하는데 사용하는것이다.

상태탐색은 DFS나 BFS등 systematic search나 genetic search같은 stochastic search를 해도 된다.

 

이 방법은 물주머니에 최적화된 풀이라기보다는, 이런류의 문제를 푸는 일반적인 방법이라고 할 수 있어 의미가 있다.

물론 매우 느리며 생성식에 따라 무한루프에 빠질수도 있으니 조심해야한다.

 

 

 

2. 상식적인 해결

water jug 문제를 많이 풀어보다 보면, 일정한 패턴이 있다.

큰 용량의 물주머니를 B라고 할 때,

1. fill A

2. pour A into B

3. if B has goal gallon then finish

4. else if B is full then empty B and goto 2.

5. fill A and goto 2.

와 같은 방법으로 해결할 수 있다.

 

 

 

3. GCD(최대공약수) 풀이

water jug 문제는 사실 gcd문제를 실제의 예로 옮겨놓은 문제이다. 즉, gcd풀이방법으로 풀 수 있다

1. if A is not full and B is empty then fill B

2. if A is full then empty A

3. pour B into A

4. repeat 1-3 until A is goal gallon or B is goal gallon

'Note..' 카테고리의 다른 글

GLFW 빌드하기  (8) 2015.05.23
libpng example link  (0) 2014.05.02
컴파일러 구성론 - VSM  (0) 2013.05.03
Unity 3d Instantiate type  (0) 2013.03.09
[DB] Newheart Academy DB - 4주차 ppt  (0) 2013.02.28