본문 바로가기

Haskell

고유문자로 축약하기

이번에는 이전에 풀어본 문자열 압축과 비슷하다. 한 번 나온 순서대로 문자열을 한 번만 표시하는 것이다.

출처 : 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