Clojure의 vector는 0개 이상의 값으로 이루어진 컬렉션이에요. 순차적이고 인덱스가 있으며 변경할 수 없죠. 즉, 한 번 vector를 만들면 수정할 수 없어요. vector를 다루는 함수는 새로운 vector를 반환하고, 원래 vector는 그대로 남아 있어요. vector 안의 값은 서로 다른 타입일 수 있어요. vector는 다음과 같이 정의할 수 있어요:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
vector의 원소는 인덱스를 사용해 가져올 수 있어요. Clojure의 vector는 0부터 시작해요. 즉, 첫 번째 원소의 인덱스는 항상 0이에요:
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
원래 vector는 변경되지 않아요:
numbers
;;=> [2 3 5]
업데이트된 값을 기억해 두려면, 그 값을 계속 넘겨주거나 var에 담아 두어야 해요:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
지난 7일 동안 정원에 몇 마리의 새가 찾아왔는지 기록하는 열정적인 새 관찰자예요.
정원에 찾아온 새의 수를 다루는 여섯 개의 과제가 있어요.
비교를 위해 지난주 기록을 항상 가까이에 두는데, 그 기록은 0, 2, 5, 3, 7, 8, 4였어요. 지난주 기록을 담은 벡터를 만들어 보세요:
last-week
;;=> [0 2 5 3 7 8 4]
today 함수를 구현해서 오늘 정원에 찾아온 새의 수를 반환해 보세요. 새의 수는 날짜 순서대로 정렬되어 있고, 첫 번째 원소는 가장 오래된 날의 수, 마지막 원소는 오늘의 수예요.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
inc-bird 함수를 구현해서 오늘의 수를 하나 늘려 보세요:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
day-without-birds? 조건 판별 함수를 구현해 보세요. 정원에 새가 한 마리도 찾아오지 않은 날이 있었다면 true를, 그렇지 않으면 false를 반환해요:
(day-without-birds? birds-per-day)
;;=> true
n-days-count 함수를 구현해 보세요. 이 함수는 주가 시작된 이후 정원에 찾아온 새의 수를 반환하는데, 세는 범위를 주가 시작된 날부터 지정한 일수까지만으로 제한해요.
(n-days-count birds-per-day 4)
;;=> 14
어떤 날은 다른 날보다 더 바빠요. 바쁜 날은 정원에 다섯 마리 이상의 새가 찾아온 날이에요.
busy-days 함수를 구현해서 바쁜 날의 수를 반환해 보세요:
(busy-days birds-per-day)
;;=> 2
지난 한 해 동안, 어떤 주들은 새가 한 마리 찾아오는 날과 한 마리도 찾아오지 않는 날이 번갈아 나타나는, 똑같은 홀수 패턴을 보인다는 걸 알게 됐어요. odd-week? 함수를 구현해서 이번 주의 새 수 패턴이 그 홀수 패턴과 일치하면 true를 반환해 보세요:
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Exercism에 가입하고 Clojure 트랙을 개념 12개연습 문제 105개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.