트랙
/
Elixir
Elixir
/
연습 문제
/
최고 점수
최고 점수

최고 점수

학습 연습 문제

소개

맵

엘릭서에서 맵은 정보를 키-값 쌍으로 저장하는 자료 구조예요. 다른 언어에서는 이런 구조를 연관 배열(PHP), 해시(Perl 5, Raku), 딕셔너리(Python)라고 부르기도 해요.

키와 값은 어떤 자료형이든 될 수 있지만, 키가 아톰이면 축약 문법을 쓸 수 있어요. 맵은 항목을 조회하거나 반환할 때 순서를 보장하지 않아요.

리터럴 형태

빈 맵은 그냥 %{}로 선언해요. 맵 리터럴에 항목을 추가하고 싶다면 두 가지 형태를 쓸 수 있어요:

# If the key is an atom:
%{atom_key: 1}

# If the key is a different type:
%{1 => :atom_value}

# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}

정해진 표준 형식은 없지만, 키-값 리터럴 쌍을 표현하는 일관된 방식을 고르는 게 좋아요.

맵 모듈 함수

엘릭서는 _맵 모듈_에서 맵을 다루는 많은 함수를 제공해요. 일부 맵 모듈 함수는 맵 변환을 돕기 위해 익명 함수를 인자로 넘겨받아요.

상수로서의 모듈 속성

엘릭서에서는 함수에서 상수처럼 쓸 수 있는 모듈 속성을 정의할 수 있어요.

defmodule Example do
  # Defines the attribute as the value 1
  @constant_number 1

  def example_value() do
    # Returns the value 1
    @constant_number
  end
end

모듈 상수를 정의할 때 쓰이는 속성은 컴파일 시점에 평가할 수 있는 어떤 표현식이든 될 수 있어요. 컴파일이 끝나면 모듈 속성에는 접근할 수 없어요. 컴파일 중에 확장되기 때문이에요. C 같은 언어에서 정의된 매크로와 비슷해요.

지침

이 연습 문제에서는 동네 오락실에서 가장 인기 있는 게임의 최고 점수를 기록하는 방법을 구현해요.

1. 새로운 최고 점수 맵 정의하기

새로운 최고 점수 맵을 만들려면, 인자를 받지 않고 비어 있는 새로운 최고 점수 맵을 반환하는 HighScore.new/0 함수를 정의해요.

HighScore.new()
# => %{}

2. 최고 점수 맵에 플레이어 추가하기

최고 점수 맵에 플레이어를 추가하려면, 3개의 인자를 받는 HighScore.add_player/3 함수를 정의해요.

  • 첫 번째 인자는 점수 맵이에요.
  • 두 번째 인자는 플레이어의 이름으로, 문자열이에요.
  • 세 번째 인자는 점수로, 정수예요. 이 인자는 선택 사항이며, 기본값이 0인 세 번째 인자를 구현해요.

기본 초기 점수는 모듈 속성에 저장해요. 나중에 다시 필요해요.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}

3. 점수 맵에서 플레이어 제거하기

최고 점수 맵에서 플레이어를 제거하려면, 2개의 인자를 받는 HighScore.remove_player/2를 정의해요.

  • 첫 번째 인자는 점수 맵이에요.
  • 두 번째 인자는 플레이어의 이름으로, 문자열이에요.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}

4. 플레이어의 점수 초기화하기

플레이어의 점수를 초기화하려면, 2개의 인자를 받는 HighScore.reset_score/2를 정의해요.

  • 첫 번째 인자는 점수 맵이에요.
  • 두 번째 인자는 점수를 초기화하려는 플레이어의 이름으로, 문자열이에요.

이 함수는 플레이어가 점수를 가지고 있지 않은 경우에도 동작해야 해요.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}

5. 플레이어의 점수 갱신하기

이전 점수에 더해서 플레이어의 점수를 갱신하려면, 3개의 인자를 받는 HighScore.update_score/3를 정의해요.

  • 첫 번째 인자는 점수 맵이에요.
  • 두 번째 인자는 점수를 갱신하려는 플레이어의 이름으로, 문자열이에요.
  • 세 번째 인자는 저장된 최고 점수에 더할 점수예요.

이 함수는 플레이어에게 이전 점수가 없는 경우에도 동작해야 해요. 이전 점수가 0이라고 가정해요.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}

6. 플레이어 목록 가져오기

플레이어 목록을 가져오려면, 1개의 인자를 받는 HighScore.get_players/1을 정의해요.

  • 첫 번째 인자는 점수 맵이에요.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elixir Exercism

최고 점수 문제를 시작해 볼 준비가 됐나요?

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