이번에는 이전에 풀어본 문자열 압축과 비슷하다. 한 번 나온 순서대로 문자열을 한 번만 표시하는 것이다.
출처 : https://www.hackerrank.com/challenges/string-reductions/problem
사실 별로 어렵지 않다.
import Data.List
test :: String -> String
test x = helper "" x
where helper acc xs =
case xs of [] -> reverse acc
(y:ys) -> if y `elem` acc
then helper acc ys
else helper (y:acc) ys
붙여나가는 순서를 역순으로하여 리스트 처리에 부담을 줄여주는 것으로 성능은 제법쓸만하다.
elem
은 리스트에 특정 원소가 있는지를 알아내는 함수로 Data.List
에 정의되어 있다.
nub
그런데 Data.List
에는 더 쓸만한 함수가 있다. 바로 nub
함수이다.
nub :: Eq a => [a] -> [a]
이 함수는 개별 원소에 대해 중복을 제거한다. 이 문제는 바로 nub
를 구현하라는 것과 같은 문제이다.
import Data.List
main = getLine >>= putStrLn . nub