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

애널린의 잠입

학습 연습 문제

소개

Go에서 불리언은 미리 선언된 불리언 타입 bool로 표현되며, 값은 true 또는 false 중 하나예요. 정의된 타입이에요.

var closed bool    // boolean variable 'closed' implicitly initialized with 'false'
speeding := true   // boolean variable 'speeding' initialized with 'true'
hasError := false  // boolean variable 'hasError' initialized with 'false' 

Go는 표현식을 불리언 값으로 평가해 true 또는 false를 반환하는 세 가지 논리 연산자를 지원해요.

연산자 의미
&& (논리곱) 두 명제가 모두 참이면 참이에요.
|| (논리합) 적어도 하나의 명제가 참이면 참이에요.
! (논리 부정) 명제가 거짓일 때만 참이에요.

지침

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

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

납치범들을 찾은 Annalyn은 다음과 같은 행동 중 무엇을 할 수 있을지 고민해요:

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

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

1. 빠른 공격을 할 수 있는지 확인하기

기사가 깨어 있는지를 나타내는 불리언 값을 받는 CanFastAttack() 함수를 정의해요. 이 함수는 기사의 상태에 따라 빠른 공격을 할 수 있으면 true를 반환하고, 그렇지 않으면 false를 반환해요:

var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false

2. 무리를 감시할 수 있는지 확인하기

기사, 궁수, 죄수가 각각 깨어 있는지를 나타내는 세 개의 불리언 값을 받는 CanSpy() 함수를 정의해요. 이 함수는 세 인물의 상태에 따라 무리를 감시할 수 있으면 true를 반환하고, 그렇지 않으면 false를 반환해요:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true

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

궁수와 죄수가 각각 깨어 있는지를 나타내는 두 개의 불리언 값을 받는 CanSignalPrisoner() 함수를 정의해요. 이 함수는 두 인물의 상태에 따라 죄수에게 신호를 보낼 수 있으면 true를 반환하고, 그렇지 않으면 false를 반환해요:

var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true

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

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

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Go Exercism

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

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