트랙
/
C#
C#
/
연습 문제
/
축구 경기 리포트
축구 경기 리포트

축구 경기 리포트

학습 연습 문제

소개

switch문

위키백과는 switch문을 "변수나 표현식의 값에 따라 프로그램의 제어 흐름을 바꿀 수 있게 해 주는, 일종의 선택 제어 구조"라고 설명해요.

이 구조에는 다음과 같은 키워드가 쓰여요: switch, case, break, default.

가장 단순한 형태에서는 원시 타입이나 문자열 표현식을 검사하고, 그 값을 바탕으로 결정을 내려요. 예를 들어 볼까요?

string direction = GetDirection();
switch (direction)
{
    case "left":
        GoLeft();
        break;
    case "right":
        GoRight();
        break;
    default:
        MarkTime();
        break;
}

가장 정교한 형태에서는 다운캐스팅 case <Type> <variable>:과 가드(when)를 함께 사용해요.

Animal animal = GetAnimal();

switch (animal)
{
    case Dog canine:
    case Coyote canine:
        canine.Bark();
        break;
    case Cat cat when cat.HasOnly8Lives():
        cat.IsCareful();
        cat.Meow();
        break;
    case Cat cat:
        cat.Meow();
        break;
}

지침

축구 클럽 웹사이트의 직원들이 경기를 보고할 수 있도록 돕는 시스템을 개발하고 있어요. 이 시스템은 경기장 안팎에서 일어나는 경기의 여러 측면을 분석해서 이벤트 스트림으로 변환해요.

1. 등번호를 기준으로 선수 설명을 출력해요

이 팀은 오직 4-3-3 포메이션으로만 경기하고, 교체 선수를 허용한 1965년 규칙 변경에도 동의한 적이 없어요. 선수단 규모를 늘리는 건 말할 것도 없고요.

선수 설명은 다음과 같아요:

1 -> "goalie"
2 -> "left back"
3 & 4 -> "center back"
5 -> "right back"
6, 7 & 8 -> "midfielder"
9 -> "left wing"
10 -> "striker"
11 -> "right wing"

등번호를 기준으로 선수 설명을 출력하도록 정적 메서드 PlayAnalyzer.AnalyzeOnField()를 구현해요.

PlayAnalyzer.AnalyzeOnField(10);
// => "striker"

2. 알 수 없는 등번호를 처리해요

1~11 범위를 벗어난 등번호가 들어오면 UNKNOWN을 보고하도록 PlayAnalyzer.AnalyzeOnField() 메서드를 수정해요.

3. 경기장 밖 활동까지 범위를 넓혀요

경기장 주변의 활동과 인물에 대한 설명을 출력하도록 PlayAnalyzer.AnalyzeOffField() 메서드를 구현해요. 이 메서드는 여러 유형의 데이터를 받는데, 그 데이터를 분석해서 기자들에게 도움이 되는 알맞은 텍스트로 변환해야 해요.

먼저 경기장에 관한 데이터부터 살펴볼게요.

  • 경기장에 있는 현재 관중 수 (임의의 int)
  • 경기장의 안내 방송 시스템을 통해 나오는 공지 (임의의 string)

알 수 없는 유형의 데이터는 처리하면 안 되므로, 메서드가 다른 유형의 데이터를 받으면 빈 문자열을 반환해야 해요.

PlayAnalyzer.AnalyzeOffField(5000);
// => "There are 5000 supporters at the match."

PlayAnalyzer.AnalyzeOffField("5 minutes to go!");
// => "5 minutes to go!"

PlayAnalyzer.AnalyzeOffField(0.5);
// => ""

4. 경기 중 일어난 사건을 보고해요

경기 중에 일어나는 사건에 대한 설명을 출력하도록 PlayAnalyzer.AnalyzeOffField() 메서드를 수정해요.

사건은 Incident 타입의 하위 클래스라면 무엇이든 될 수 있고, 사건에 대한 설명을 담고 있어요. 부상은 경기를 중단시키기 때문에 특별한 종류의 사건이고, 따라서 다르게 처리해야 해요.

PlayAnalyzer.AnalyzeOffField(new Foul());
// => "The referee deemed a foul."

PlayAnalyzer.AnalyzeOffField(new Injury(8));
// => "Oh no! Player 8 is injured. Medics are on the field."

5. 클럽 감독을 보고해요

경기장에 있는 클럽 감독을 언급하도록 PlayAnalyzer.AnalyzeOffField() 메서드를 수정해요.

감독은 Manager 타입의 인스턴스이고, 이름과 자신이 맡고 있는 클럽의 이름을 가지고 있어요. 감독의 클럽은 알 수 없을 수도 있는데, 이 경우 null로 설정돼요. 감독의 클럽을 알 수 없다면, 그 클럽은 설명에 포함되지 않아야 해요.

PlayAnalyzer.AnalyzeOffField(new Manager("José Mário dos Santos Mourinho Félix", null));
// => "José Mário dos Santos Mourinho Félix"

PlayAnalyzer.AnalyzeOffField(new Manager("Jürgen Klopp", "Liverpool"));
// => "Jürgen Klopp (Liverpool)"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

축구 경기 리포트 문제를 시작해 볼 준비가 됐나요?

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