생성일: 2019년 12월 23일
수정일: 2023년 08월 16일

4clojure - Filter Perfect Squares (74)

  1. 문제
  2. 풀이
    1. 풀이과정

문제

(= (__ "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"
Tags: 4clojure Today I Learn