얼핏 본바로는 소인수분해를 해서 그 리스트를 나누어진 조각중 가장 큰 것보다 큰 것중 가장 작은것을 가져오면 될듯하다

;; 길이가 같은 여러 개의 막대를 잘라 다양한 길이로 만들었다.
;; 원래대로 막대를 돌려놓을 때 가능한 길이중 가장 작은 값을 찾아라..
;; 해당하는 문제는 소인수 분해를 해서, 그 중에 잘라놓은 막대보다 큰 것중 가장 작은 수를 구하면 된다.
;; 소인수 분해를 하자.. 소인수 분해의 수는 소수만 가능.. 1은 제외하고 2부터..
(defun sum (lst)
(cond ((null lst) 0)
(t (+ (car lst)
(sum (cdr lst))))))
(defun max-lst (lst)
(cond ((= (length lst) 1) (car lst))
((null lst) '())
(t (max (car lst)
(max-lst (cdr lst))))))
(defun min-lst (lst)
(cond ((= (length lst) 1) (car lst))
((null lst) '())
(t (min (car lst)
(max-lst (cdr lst))))))
(defun digest-num (n)
(labels ((iter (s n)
(cond ((>= s n) '())
(t
(cond ((= (mod n s) 0)
(cons s (iter (+ s 1) n)))
(t
(iter (+ s 1) n)))))))
(iter 2 n)))
(defun bar-check (lst)
(let ((wholebar (sum lst))
(max-ele (max-lst lst)))
(let ((dnum (digest-num wholebar)))
(let ((least-max (find-at-least dnum max-ele)))
(cond
((null least-max) -1)
((= wholebar least-max) -1)
(t
least-max))))))
;; 리스트 내역을 필터링하기
(defun filter (lst proc)
(cond ((null lst) '())
(t
(if (funcall proc (car lst))
(cons (car lst) (filter (cdr lst) proc))
(filter (cdr lst) proc)))))
;; 리스트중 v보다 큰 요소중 가장 작은 것을 구하기..
(defun find-at-least (lst v)
(min-lst (filter lst
#'(lambda (c)
(> c v)))))
