트랙
/
Common Lisp
Common Lisp
/
연습 문제
/
Logan의 숫자 분할
Logan의 숫자 분할

Logan의 숫자 분할

학습 연습 문제

소개

리듀싱

리듀싱은 시퀀스의 각 원소에 함수를 반복해서 적용하고, 그 결과를 어떤 방식으로든 누적하는 거예요. 적용되는 함수는 두 개의 매개변수를 받아요. 현재 누적된 값과 처리할 항목이에요. 이 함수는 새로운 누적 값으로 평가되어야 해요.

Common Lisp에서는 이 과정을 reduce 함수로 처리해요. 가장 단순한 형태는 다음과 같아요.

(reduce #'function-to-apply sequence :initial-value value)

초깃값이 제공된다는 점에 주목해요. 이 값은 첫 번째 원소가 처리될 때 함수에 전달되는 '현재 누적된 값'이 돼요.

다음은 초깃값 10으로 시작해서 리스트의 숫자들을 모두 더하는 예제예요.

(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20

시퀀스가 비어 있으면 함수는 호출되지 않고, 폼은 초깃값으로 평가돼요.

지침

Lisp 외계인 Logan은 숫자를 좋아하고, 정리하는 것도 좋아해요.

Logan은 숫자 배열을 받아서 두 개의 배열로 이루어진 쌍을 만들어 주는 함수 작성을 도와달라고 해요. 첫 번째 배열에는 홀수가, 두 번째 배열에는 짝수가 들어가요.

1. 숫자 분류하기

먼저 두 개의 배열로 이루어진 쌍과 숫자 하나를 받아서, 그 숫자가 홀수인지 짝수인지에 따라 알맞은 배열에 넣는 함수를 만들어야 해요:

(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))

2. 여러 숫자 분류하기

이제 방금 만든 함수를 이용해서, 숫자 배열을 받아 위에서처럼 분류하는 또 다른 함수를 작성할 수 있어요:

(partition-numbers '(1 2 3 4))     ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Common Lisp Exercism

Logan의 숫자 분할 문제를 시작해 볼 준비가 됐나요?

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