최고 점수

최고 점수

학습 연습 문제

소개

해시 테이블

Common Lisp의 해시 테이블은 연관 데이터를 저장하기 위한 자료 구조예요. 키(어떤 객체든 될 수 있어요)를 값(역시 어떤 객체든 될 수 있어요)에 대응시켜요. 다른 언어에서는 이 개념을 맵, 딕셔너리, 해시라고 부르기도 해요.

해시 테이블 만들기

해시 테이블은 make-hash-table 함수로 만들 수 있어요.

(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>

(해시 테이블이 출력되는 모습은 구현에 따라 다르기 때문에, REPL에서는 다르게 보일 수도 있어요.)

키로 값 가져오기

해시 테이블에서 키로 값을 가져오려면 gethash 함수를 사용해요:

*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
                   ;    T

gethash는 여러 개의 값을 반환하는데, 이는 다른 개념에서 설명해요.

값 넣기

해시 테이블에 값을 넣으려면 gethash와 함께 setf를 이렇게 사용해요:

(setf (gethash :foo *hash-table*) :bar) : => :bar

이렇게 하면 해시 테이블 *hash-table*에서 키 :foo에 대한 값이 :bar로 바뀌어요. 그리고 그 값을 반환해요.

setf의 사용법은 다른 개념에서 설명해요.

지침

라몬트는 자기만의 비디오 게임을 만들고 싶어 하는 리스프 외계인이에요. 라몬트가 도움을 요청한 작업 중 하나는 최고 점수 목록을 관리하는 일이에요.

1. 최고 점수 테이블 만들기

인자를 전혀 받지 않고 비어 있는 새로운 해시 테이블로 평가되는 함수 make-high-score-table을 정의해요:

(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>

2. 테이블에 플레이어 추가하기

테이블에 플레이어를 추가하려면 두 개의 인자를 받는 함수 add-player를 정의해요:

  • 최고 점수 테이블
  • 키워드로 된 플레이어의 이름

플레이어의 초기 점수는 0으로 설정해요.

(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0

3. 플레이어의 점수 설정하기

플레이어의 점수를 설정하려면 세 개의 인자를 받는 함수 set-score를 정의해요:

  • 최고 점수 테이블
  • 키워드로 된 플레이어의 이름
  • 정수로 된 플레이어의 점수
(set-score hash-table :louis 1234) ; => 1234

4. 테이블에서 점수 가져오기

테이블에서 플레이어의 점수를 가져오려면 두 개의 인자를 받는 함수 get-score를 정의해요:

  • 최고 점수 테이블
  • 키워드로 된 플레이어의 이름

이 함수는 플레이어에 대해 저장된 점수로 평가되어야 해요. 그 플레이어에 대해 저장된 점수가 없거나, 그 플레이어가 아직 테이블에 없다면 0으로 평가해요.

(get-score hash-table :louis)                         ; => 1234
(get-score hash-table :lilly)                         ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0

5. 테이블에서 플레이어 제거하기

최고 점수 테이블에서 플레이어를 제거하려면 두 개의 인자를 받는 함수 remove-player를 정의해요:

  • 최고 점수 테이블
  • 키워드로 된 플레이어의 이름

이 함수는 플레이어가 아직 테이블에 추가되지 않은 경우도 문제없이 처리해야 해요. 플레이어를 제거한 뒤에 테이블에서 그 플레이어의 점수를 가져오면 당연히 0이 돼요.

(set-score hash-table :louis 1234)           ; => 1234
(remove-player hash-table :louis)            ; => T
(get-score hash-table :louis)                ; => 0

(remove-player hash-table :not-in-the-table) ; => NIL
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Common Lisp Exercism

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

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