생성일: 2019년 12월 23일
수정일: 2023년 08월 16일
수정일: 2023년 08월 16일
4clojure - Filter Perfect Squares (74)
문제
(= (__ "4,5,6,7,8,9") "4,9")
(= (__ "15,16,25,36,37") "16,25,36")
풀이
(fn [st]
(clojure.string/join ","
(filter #(zero? (rem (Math/sqrt %) 1))
(map read-string
(re-seq #"\d+" st)))))
풀이과정
우선 stirng을 collection으로 나누는 작업이 필요하다
(re-seq #"\d+" "1,2,3,4,5,6,7")
;; ("1" "2" "3" "4" "5" "6" "7")
그다음에 나누어진 string을 int 형으로 변환을 해야한다.
(map read-string (re-seq #"\d+" "1,2,3,4,5,6,7"))
;; (1 2 3 4 5 6 7)
이제부터가 중요한데 사실 완전제곱수라는 것을 어떻게 판별을 해야하는지 아무리 생각을 해도 떠오르지가 않아서 인터넷으로 찾아 봤다. 그랬더니 아래와 같은 몇가지 방법이 있었다.
;; 1
(rem (Math/sqrt 4) 1)
;; 0
;; 2
(= 2 (* (int (Math/sqrt 2)) (int (Math/sqrt 2))))
;; false
(= 4 (* (int (Math/sqrt 4)) (int (Math/sqrt 4))))
;; true
;; 3
(== (Math/sqrt 4) (int (Math/sqrt 4)))
;; true
(== (Math/sqrt 3) (int (Math/sqrt 3)))
;; true
총 3가지 방법을 예제로 변형을 해봤다. 1번째 방법은 정수 일때 1로 나누면 무조건 0으로 반환을 하는 성질을 이용해서 완전제곱수가 정수 이므로 그 원리를 이용 한 것이고 2번째는 제곱의 수가 원래 수와 같은지 판별을 할 수 있는 문제이다 사실 2번째 방법을 좀 더 생각했다면 생각했을 법한 방법이라고 생각 한다.
3번째 방법은 ==이 clojure에서 있는 등호라는 것을 몰랐기 때문에 생각을 할 수 없는 방법이라고 생각한다. ==의 사용법에 대해서는 좀 더 공부가 필요하다
나머지 식에 대한 성질이 수학적인 방법인 것 같아서 그 방법을 사용 하였다.
clojure.string/join을 사용하여 string으로 만드는 작업을 하였다.
(clojure.string/join "," '(1, 4))
;; "1,4"
interpose와 apply를 사용하여 합치는 방법도 있다.
(interpose "," [1 4])
;; (1 "," 4)
(apply str '(1 "," 4))
;; "1,4"