정석 알고리즘은 아닙니다.
그런 공부를 해본적도 없고, 뭔지도 모릅니다.
다만, 제가 아는 리습의 함수를 응용해서 구현한 것 뿐입니다.
꽁수라고 해도~ +,.+
아래와 같이 구현(?) 해 보았습니다.
님이 원하는 답은 나오네요.
아래 코드를 복사해서 리습파일로 만들어 저장한 다음 로드해서 사용하시면 됩니다.
리습 사용법은 아시리라 믿고...
(defun DoggiSort (source / A CONT N NCNT RESULT SKEY TCNT VSTR)
(defun SortMyBoltList (bList / nList) ; 각 아이템을 String으로 연결합니다.
(setq nList (mapcar
'(lambda (itm)
(setq itm (strcat (last itm) "," ; 재질
(cadr itm) "," ; 크기
(cadddr itm) "," ; 길이
(caddr itm) "," ; "?"
(car itm) ;수량
))
)
bList
)
)
(setq nList (acad_strlsort nList)); 리스트 내 문자열을 소트합니다.
)
(defun Lsp:Split (str ch / LST N NS S); 문자열을 분해하여 리스트로.
(setq n 1 ns "" lst '())
(if (/= str "")
(progn
(repeat (strlen str)
(setq s (substr str n 1))
(if (= s ch)
(setq lst (cons ns lst) ns "")
(setq ns (strcat ns s))
)
(if (= n (strlen str)) (setq lst (cons ns lst)))
(setq n (1+ n))
)
(setq lst (reverse lst))
)
)
lst
)
(setq a (SortMyBoltList source)) ;; 정렬된 리스트
(setq n 0); Loop Index
(setq nCnt 0) ; n번째 아이템의 수량
(setq Result '()); 결과 리스트
(while (< n (length a)) ; List a 의 갯수만큼 Loop->
(setq cont T) ; 계속진행 Flag
(setq vStr (Lsp:Split (nth n a) ",")) ; Item(n)을 분리. "a,b,c,d" 를 ("a" "b" "c" "d") 로
(setq sKey (strcat (car vStr) "," (cadr vStr) "," (caddr vStr) ",")); Item(n)의 규격
(setq nCnt (atoi (last vStr))) ; Item(n)의 수량
(while (and (< n (- (length a) 1)) (= Cont T)) ; List a 갯수보다 작고, 계속진행Flag가 T 일때 Loop
(if (= (substr (nth (+ n 1) a) 1 (strlen skey)) skey) ;; Item(n) 과 Item(n+1) 이 동일 규격이면
(progn
(setq vStr (Lsp:Split (nth (+ n 1) a) ",")) ; Item(n+1)을 분리. "a,b,c,d" 를 ("a" "b" "c" "d") 로
(setq tCnt (atoi (last vStr))) ; Item(n+1)의 수량
(setq nCnt (+ nCnt tCnt)) ; 현재 수량에 다음 수량을 더함
(setq n (1+ n)) ; 다음 아이템
)
(setq cont nil) ; Item(n) 과 Item(n+1)이 다른 아이템이면 Loop 마침.
)
)
(setq Result (cons (list nCnt (cadr vstr) (cadddr vstr) (caddr vstr) (car vstr) ) Result)) ; 결과 리스트에 추가
(setq n (1+ n)) ; 다음 아이템 <-
)
(setq Result (reverse Result)) ; 결과 리스트의 아이템들의 순서를 반대로.
)
(defun c:test ()
; 수량 볼트크기 ? 길이 재질
(setq source (list (list "6" "7/8 HSB" "0" "2.25" "A325")
(list "8" "7/8 HSB" "0" "2.25" "A325")
(list "6" "3/4 MS" "0" "2" "A307")
(list "8" "7/8 HSB" "0" "2" "A325")
(list "4" "3/4 HSB" "0" "2.25" "A325")
(list "10" "3/4 MS" "0" "2.5" "A307")
(list "6" "7/8 HSB" "0" "2.5" "A325")
(list "8" "7/8 HSB" "0" "2.5" "A325")
)
) ;; 리스트 원형
(setq result (doggisort source))
)
주석까지 자세히 달아드렸으니, 이해하시는데 무리가 없으리라 생각됩니다.
공부하시는데 도움이 되었으면 하는 바램입니다.
필. ^,.^ γ
첫댓글 잘 봤습니다! 감사합니다~~