트랙
/
Clojure
Clojure
/
연습 문제
/
애널린의 잠입
애널린의 잠입

애널린의 잠입

학습 연습 문제

소개

Clojure에서 불리언은 true 또는 false로 표현해요.

프레디킷 함수(불리언을 반환하는 함수)는 보통 물음표(?)로 끝나지만, 이건 관례일 뿐이에요.

코어 라이브러리에는 not, and, or 같은 논리 연산자를 위한 함수가 들어 있어요.

지침

이 연습 문제에서는 친구가 개발 중인 새로운 RPG 게임의 퀘스트 로직을 구현해요. 게임의 주인공은 용감한 소녀 애널린과 사납고 충직한 반려견이에요. 그런데 안타깝게도 불행이 닥쳐요. 친구가 숲에서 열매를 찾던 중 납치된 거예요. 애널린은 친구를 찾아 구출하려고 해요. 이 퀘스트에 반려견을 데리고 갈 수도 있어요.

한동안 흔적을 따라간 끝에, 애널린은 친구가 갇혀 있는 야영지를 발견해요. 알고 보니 납치범은 둘이었어요. 힘센 기사와 교활한 궁수예요.

납치범들을 찾은 애널린은 다음 행동 중 어떤 것을 할 수 있을지 고민해요:

  • 빠른 공격: 기사가 잠들어 있으면 빠른 공격을 할 수 있어요. 갑옷을 입는 데 시간이 걸리기 때문에 그동안 기사는 무방비 상태가 돼요.
  • 첩보: 일행 중 적어도 한 명이 깨어 있으면 몰래 살펴볼 수 있어요. 그렇지 않으면 첩보는 시간 낭비예요.
  • 포로에게 신호 보내기: 포로가 깨어 있고 궁수가 잠들어 있으면 새소리로 포로에게 신호를 보낼 수 있어요. 궁수는 새소리 신호 훈련을 받았기 때문에 깨어 있으면 메시지를 가로챌 수 있어요.
  • 포로 구출: 애널린은 몰래 야영지에 들어가 포로를 구출하려고 시도할 수 있어요. 위험한 일이라 두 가지 방법 중 하나로만 성공할 수 있어요:
    • 애널린이 반려견을 데리고 있으면 궁수가 잠들어 있을 때 포로를 구출할 수 있어요. 기사는 개를 무서워하고, 궁수는 애널린과 포로가 도망치기 전에 준비할 시간이 없어요.
    • 애널린이 반려견을 데리고 있지 않으면 애널린과 포로는 아주 조심스럽게 움직여야 해요! 포로가 깨어 있고 기사와 궁수가 둘 다 잠들어 있으면 애널린은 포로를 구출할 수 있지만, 포로가 잠들어 있으면 구출할 수 없어요. 포로는 애널린이 갑자기 나타난 것에 놀라서 기사와 궁수를 깨우고 말 거예요.

네 가지 작업이 있어요. 숲에 있는 세 인물의 상태와 애널린의 반려견이 함께 있는지 여부에 따라 위 행동들이 가능한지 판단하는 로직을 구현하는 거예요.

1. 빠른 공격이 가능한지 확인하기

기사가 깨어 있는지를 나타내는 불리언 값을 받는 can-fast-attack? 함수를 구현해요. 이 함수는 기사의 상태에 따라 빠른 공격이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요:

(def knight-awake? true)

(can-fast-attack? knight-awake?)
;;=> false

2. 첩보가 가능한지 확인하기

기사, 궁수, 포로가 각각 깨어 있는지를 나타내는 세 개의 불리언 값을 받는 can-spy? 함수를 구현해요. 이 함수는 세 인물의 상태에 따라 첩보가 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요:

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)

(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true

3. 포로에게 신호를 보낼 수 있는지 확인하기

궁수와 포로가 각각 깨어 있는지를 나타내는 두 개의 불리언 값을 받는 can-signal-prisoner? 함수를 구현해요. 이 함수는 두 인물의 상태에 따라 포로에게 신호를 보낼 수 있으면 true를 반환해요. 그렇지 않으면 false를 반환해요:

(def archer-awake? false)
(def prisoner-awake? true)

(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true

4. 포로를 구출할 수 있는지 확인하기

네 개의 불리언 값을 받는 can-free-prisoner? 함수를 구현해요. 처음 세 매개변수는 기사, 궁수, 포로가 각각 깨어 있는지를 나타내요. 마지막 매개변수는 애널린의 반려견이 함께 있는지를 나타내요. 이 함수는 세 인물의 상태와 애널린의 반려견의 동반 여부에 따라 포로를 구출할 수 있으면 true를 반환해요. 그렇지 않으면 false를 반환해요:

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)

(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Clojure Exercism

애널린의 잠입 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Clojure 트랙을 개념 12개연습 문제 105개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.