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

애널린의 잠입

학습 연습 문제

소개

불리언

bool 타입은 불리언(boolean)의 줄임말로, true와 false 두 가지 값만 가져요. 코드에서 true와 false 리터럴 값은 대소문자를 구분하지 않아요.

<?php

$value_is_true = true;
$value_is_false = false;

불리언 값은 논리식에서 연산자의 결과로 자주 쓰이고, 그다음 제어 구조에서 사용돼요.

논리 연산자

논리 연산자에는 여러 가지가 있어요:

  • !$a: $a가 true가 아니면 true를 반환해요
  • $a && $b: $a와 $b가 모두 true면 true를 반환해요
  • $a || $b: $a나 $b 중 하나라도 true면 true를 반환해요
Caution

and 연산자와 or 연산자가 있고, 이들은 각각 &&와 ||에 대응해요. 하지만 &&와 ||와 똑같이 동작하지는 않아서 예상치 못한 결과를 낼 수 있으니, 사용을 권장하지 않아요.

지침

이 연습 문제에서는 친구가 개발 중인 새로운 RPG 게임의 퀘스트 로직을 구현해요. 게임의 주인공은 Annalyn으로, 용감한 소녀이자 사납지만 충직한 반려견의 주인이에요. 그런데 안타깝게도, 가장 친한 친구가 숲에서 열매를 찾다가 납치되는 일이 벌어져요. Annalyn은 이 퀘스트를 떠나 친구를 찾아내고 구출하려고 해요. 원한다면 반려견과 함께 갈 수도 있어요.

친구의 흔적을 한참 따라간 끝에, Annalyn은 친구가 갇혀 있는 야영지를 발견해요. 납치범은 둘이었는데, 하나는 힘센 기사이고 다른 하나는 교활한 궁수예요.

납치범들을 찾은 Annalyn은 다음 행동 중 어떤 것을 할 수 있을지 고민해요.

  • 빠른 공격: 기사가 잠들어 있을 때 빠른 공격을 할 수 있어요. 갑옷을 입는 데 시간이 걸려서 기사가 무방비 상태가 되기 때문이에요.
  • 정찰: 무리 중 적어도 한 명이 깨어 있으면 정찰을 할 수 있어요. 그렇지 않으면 정찰은 시간 낭비예요.
  • 죄수에게 신호 보내기: 죄수가 깨어 있고 궁수가 잠들어 있으면 새소리로 죄수에게 신호를 보낼 수 있어요. 궁수는 새소리 신호를 익혔기 때문에 메시지를 가로챌 수도 있거든요.
  • 죄수 구출: Annalyn은 몰래 야영지에 들어가 죄수를 풀어줄 수 있어요. 위험한 일이라 두 가지 방법 중 하나로만 성공할 수 있어요.
    • 반려견과 함께 있다면 궁수가 잠들어 있을 때 죄수를 구출할 수 있어요. 기사는 개를 무서워하고, 궁수는 Annalyn과 죄수가 도망치기 전에 준비할 시간이 없어요.
    • 반려견이 없다면 Annalyn과 죄수는 아주 조심스럽게 움직여야 해요! 죄수가 깨어 있고 기사와 궁수가 둘 다 잠들어 있으면 죄수를 풀어줄 수 있지만, 죄수가 잠들어 있으면 구출할 수 없어요. Annalyn이 갑자기 나타나면 죄수가 놀라서 기사와 궁수를 깨울 테니까요.

이제 네 가지 과제가 있어요. 숲에서 만난 세 인물의 상태와 Annalyn의 반려견 동반 여부에 따라 위 행동을 할 수 있는지 판단하는 로직을 구현해요.

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

기사가 깨어 있는지를 나타내는 불리언 값을 받는 canFastAttack이라는 함수를 구현해요. 이 함수는 해당 인물의 상태에 따라 '빠른 공격' 행동이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요.

<?php
$is_knight_awake = true;

$infiltration = new AnnalynsInfiltration();
$infiltration->canFastAttack($is_knight_awake);
// => false

2. '정찰' 행동이 가능한지 확인하기

기사, 궁수, 죄수가 각각 깨어 있는지를 나타내는 세 개의 불리언 값을 받는 canSpy라는 함수를 구현해요. 이 함수는 인물들의 상태에 따라 '정찰' 행동이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요.

<?php
$is_knight_awake = false;
$is_archer_awake = true;
$is_prisoner_awake = false;

$infiltration = new AnnalynsInfiltration();
$infiltration->canSpy($is_knight_awake, $is_archer_awake, $is_prisoner_awake);
// => true

3. '죄수에게 신호 보내기' 행동이 가능한지 확인하기

궁수와 죄수가 각각 깨어 있는지를 나타내는 두 개의 불리언 값을 받는 canSignal이라는 함수를 구현해요. 이 함수는 인물들의 상태에 따라 '죄수에게 신호 보내기' 행동이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요.

<?php
$is_archer_awake = false;
$is_prisoner_awake = true;

$infiltration = new AnnalynsInfiltration();
$infiltration->canSignal($is_archer_awake, $is_prisoner_awake);
// => true

4. '죄수 구출' 행동이 가능한지 확인하기

네 개의 불리언 값을 받는 canLiberate라는 함수를 구현해요. 처음 세 매개변수는 기사, 궁수, 죄수가 각각 깨어 있는지를 나타내요. 마지막 매개변수는 Annalyn의 반려견이 함께 있는지를 나타내요. 이 함수는 인물들의 상태와 Annalyn의 반려견 동반 여부에 따라 '죄수 구출' 행동이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요.

<?php
$is_knight_awake = false;
$is_archer_awake = true;
$is_prisoner_awake = false;
$is_dog_present = false;

$infiltration = new AnnalynsInfiltration();
$infiltration->canLiberate(
    $is_knight_awake,
    $is_archer_awake,
    $is_prisoner_awake,
    $is_dog_present
);
// => false
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
PHP Exercism

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

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