기본적인 배열 연산을 구현해요.
함수형 언어에서는 length, map, reduce 같은 배열 연산을 아주 흔하게 사용해요.
기존 함수를 사용하지 않고, 일련의 기본적인 배열 연산을 직접 구현해요.
구현할 연산의 정확한 개수와 이름은 기존 이름과의 충돌을 피하기 위해 track마다 달라요. 하지만 일반적으로 구현하게 될 연산은 다음과 같아요:
append (주어진 두 배열에서, 두 번째 배열의 모든 항목을 첫 번째 배열의 끝에 추가해요);concatenate (주어진 여러 배열의 모든 항목을 하나로 평탄화한 배열로 합쳐요);filter (주어진 술어와 배열에서, predicate(item)이 True인 모든 항목의 배열을 반환해요);length (주어진 배열의 전체 항목 개수를 반환해요);map (주어진 함수와 배열에서, 모든 항목에 function(item)을 적용한 결과의 배열을 반환해요);foldl (주어진 함수, 배열, 초기 누적자를 받아, 왼쪽부터 각 항목을 누적자에 접어 넣어요(누적해요));foldr (주어진 함수, 배열, 초기 누적자를 받아, 오른쪽부터 각 항목을 누적자에 접어 넣어요(누적해요));reverse (주어진 배열의 모든 원래 항목을 뒤집힌 순서로 담은 배열을 반환해요).참고로, fold 함수(foldl, foldr)에 인자가 전달되는 순서는 중요해요.
위의 지침은 모든 언어 트랙에서 일관성을 유지하기 위해 공유 저장소와 동기화되어 있어요. 이 부록은 Clojure 트랙의 목표에 더 잘 맞도록 필요에 따라 지침을 추가로 명확히 설명하거나 수정해요.
Clojure 트랙의 이 연습 문제에서는 테스트가 보여 주듯이 입력과 출력이 모두 벡터라고 가정해요. 도전 과제 삼아, 중간 단계에 리스트를 사용하지 않는 접근 방식을 어떻게 구현할지 생각해 봐요.
비슷한 기능을 하는 기존 Clojure 내장 함수를 재사용하지 않는 것이 중요해요. 그러면 이 문제가 의도한 학습 가치가 줄어들기 때문이에요.
피해야 할 clojure.core 네임스페이스의 주요 함수로는 into, concat, cat, lazy-cat, mapcat, flatten, filter, filterv, remove, count, map, mapv, reduce, transduce, reverse, rseq 등이 있어요.
선택 목표는 추가 도전을 원하는 분들을 위한 것으로, 이미 주요 목표를 완료했다고 가정하고 설계되었어요.
다음을 가정하는 접근 방식을 고안해서 테스트를 통과해 봐요:
이것을 공개하기로 했다면, 리스트를 사용하는 선택 목표를 다룬다는 것을 알려 주는 주석을 꼭 넣어요. docstring 업데이트도 잊지 마세요!
Exercism에 가입하고 Clojure 트랙을 개념 12개연습 문제 105개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
재귀를 실용적으로 소개하는 내용을 즐기면서, 배열 연산의 명령형 및 함수형 대안을 살펴보고, 꼬리 호출 재귀와 누산기 함수까지 깊이 파고들어요.