CommonLisp (w/o LOOP-macro) / LeetCode "1614. max nesting depth of the parentheses"


어제 작성한 LOOP매크로을 이용한 구현 을 풀어서, 만약 LOOP매크로가 없었더라면 어떻게 짰을지 작성해봤다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(defun max-nested-parentheses-raw (s)
  (declare (optimize (speed 3) (safety 0))
           (type simple-string s))
  (let ((n 0)
        (result 0))
    (declare (type fixnum n result))
    (dotimes (s--cur-idx (length s))
      (let ((ch (elt s s--cur-idx)))
        (when (member ch '(#\( #\)))
          (incf n (if (eql #\( ch) 1 -1))
          (setf result (max n result)))))
    result))

여전히 타입을 지정해서 자동으로 타입추론, 최적화 하도록 했다.

그런데 여전히 dotimes, when, incf, max 같은 커먼리습 HyperSpec에서 표준에 포함시킨 매크로 등을 사용했다. 물론 이런 것들도 다 풀어서 작성해도 되겠지만 별 의미는 없을 것 같아서.

CommonLisp / LeetCode "1614. max nesting depth of the parentheses"


작성한 코드

1
2
3
4
5
6
7
8
  (defun max-nested-parentheses (s)
    (declare (optimize (speed 3) (safety 0))
             (type simple-string s))
    (loop with n fixnum = 0
          for ch across s
          when (member ch '(#\( #\)))
          do (incf n (if (eql #\( ch) 1 -1))
             maximizing n))

코드 의도

  1. 우아한 코드보다는 공간복잡도가 O(1) 이고 싶었다.

Edit

  1. SBCL에 맞춰 코드에 타입을 지정해줘봤다.

    1. 결과 어셈블리 코드가 조금 짧아졌다.

Ping 19/Oct/2020


가을

도르트문트 집은 꽤 평화로웠다. 날씨가 좋은 날도 많고 공기도 맑았다. 한가한 주말이 되면 창문을 열고 잔디가 깔린 정원을 보며 담배를 태우고 커피를 내려 마셨다.

그리고 지하세탁장에 빨래를 돌려놓고 핑크플로이드의 다크사이드 오브 더 문 앨범을 좋은 스피커로 틀어놓았다. 잘 어울렸다.

서울의 변두리에서 맞는 이번 가을은 그런 기분이다. 조용하고 가을 햇살과 공기가 맑아졌다.

그리고 핑크플로이드를 그렇게 여유롭게 들을 수 있었다.