크기가 서로 다른 양동이 두 개와, 어느 양동이를 먼저 채울지가 주어졌을 때, 양동이 사이로 물을 전략적으로 옮겨 정확한 리터 수를 측정하는 데 필요한 동작 횟수를 구하세요.
풀이가 따라야 하는 규칙이 몇 가지 있어요:
프로그램은 다음을 입력으로 받아요:
프로그램은 다음을 구해야 해요:
참고: 양동이 하나에 변화가 생기든 둘 모두에 변화가 생기든, 그때마다 동작 한 번(1회)으로 쳐요.
예시: one 양동이에는 최대 7리터, two 양동이에는 최대 11리터를 담을 수 있어요. 어떤 단계에서 one 양동이에 7리터, two 양동이에 8리터가 들어 있다고 해봐요 (7,8). one 양동이를 비우고 two 양동이는 그대로 두어 각각 0리터와 8리터가 남는다면 (0,8), 이는 동작 한 번으로 쳐요. 반대로, two 양동이가 가득 찰 때까지 one 양동이에서 two 양동이로 물을 부어 one 양동이에 4리터, two 양동이에 11리터가 되었다면 (4,11), 이것도 동작 한 번으로만 쳐요.
또 다른 예시: one 양동이에는 3리터, two 양동이에는 최대 5리터를 담을 수 있어요. one 양동이부터 시작해야 한다고 해봐요. 그러면 첫 번째 동작은 one 양동이를 채우는 거예요. 두 번째 동작으로는 one 양동이를 비우기로 해요. 세 번째 동작으로는 two 양동이를 채우면 안 돼요. 세 번째 규칙을 어기게 되거든요. 어떤 동작을 한 뒤에도 시작 양동이가 비어 있고 다른 양동이가 가득 찬 상태가 되면 안 되니까요.
Lindsay Levine이 Fullstack Academy에서 <3를 담아 작성했어요.
twobucket 패키지에서 다음 시그니처를 가진 Go 함수 Solve를 구현해요:
func Solve(sizeBucketOne,
sizeBucketTwo, goalAmount int, startBucket string,
) (goalBucket string, numSteps, otherBucketLevel int, e error)
Solve는 네 가지 값을 반환해요: 목표를 이룬 버킷("one" 또는 "two"), 목표량에 도달하기까지의 이동/단계 수, 다른 버킷에 남은 리터, 그리고 오류 값이에요. 유효하지 않은 매개변수가 있거나 해답이 존재하지 않으면 오류를 반환해요.
Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.