얼룩말 퍼즐은 집 다섯 채가 나오는 유명한 논리 퍼즐이에요. 집은 각각 다른 색으로 칠해져 있고, 사는 주민도 서로 달라요. 주민들은 국적도 다르고, 키우는 반려동물도 다르고, 마시는 음료도 다르고, 즐기는 취미도 달라요.
퍼즐을 풀 수 있도록, 정답을 설명하는 15개의 명제가 주어져요. 하지만 모든 명제의 정보를 조합해야만 퍼즐의 정답을 찾을 수 있어요.
얼룩말 퍼즐은 제약 충족 문제(CSP)예요. 이런 문제에는 가능한 값의 집합과, 어떤 값이 유효한지 제한하는 제약 조건의 집합이 있어요. 잘 알려진 또 다른 CSP로는 스도쿠가 있어요.
이번 과제는 얼룩말 퍼즐을 풀어서 다음 두 가지 질문의 답을 찾는 거예요:
다음 15가지 문장은 모두 참이라고 알려져 있어요:
게다가 다섯 채의 집은 각각 다른 색으로 칠해져 있고, 그곳에 사는 사람들은 각각 다른 국적이고, 다른 반려동물을 키우고, 다른 음료를 마시고, 다른 취미를 가져요.
가능한 해답은 240억 가지(5!⁵ = 24,883,200,000)나 되니, 최대한 많은 해답을 걸러 내봐요.
ZebraPuzzle 클래스의 waterDrinker 메서드와 zebraOwner 메서드를 구현해요.
두 메서드는 각각 문자열을 반환해야 하고, 그 값은 얼룩말 퍼즐의 질문 "물은 누가 마실까?"와 "얼룩말은 누가 키울까?"에 대한 답이에요.
각 답은 거주자의 국적 중 하나예요: Englishman, Spaniard, Ukrainian, Norwegian, Japanese.
물론 테스트 프로그램을 살짝 들여다보고 예상 정답을 확인하면, 문 하나짜리 함수 두 개를 그냥 작성할 수도 있어요. 하지만 목표는 퍼즐에 주어진 사실과 제약 조건을 활용해서 두 정답을 찾아내는 알고리즘을 만들어 내는 거예요.
Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
가능한 풀이 240억 개 중에서 얼룩말 퍼즐의 정답을 찾아내는 여덟 가지 방법을 살펴봐요. 잘못된 순열을 최대한 빨리 걸러내는 방법부터 AC-3 알고리즘, 아주 간결한 논리 기반 풀이, 심지어 유전 알고리즘까지 다뤄요!