리스트 두 개가 주어졌을 때 서로 포함 관계인지를 확인하는 문제였다. Easy 난이도 문제였음에도 제법 까다로웠다.
테스트 케이스에 100만 단위 리스트가 있어서, 퍼포먼스를 챙기려면 항목을 하나하나 비교하다가 틀린 것이 확실해지자마자 빠져나와야겠다 싶어 처음에는 재귀로 작성했었다. 그런데 하다 보니 영 아닌 것 같아 다른 사람들의 답을 확인해봤더니 List.starts_with?
를 쓰고 있기에 '이렇게 쉽게 짜도 된다고?' 하면서 어리벙벙하며 가져와 완성한 것이 지금 코드.
지금까지의 문제와 달리 웹상에서는 실행되지 않는 무거운 테스트들이 있는데, 거기까지 테스트해보지는 않았다. 부디 잘 돌아갔으면 한다.
defmodule Sublist do
@doc """
Returns whether the first list is a sublist or a superlist of the second list
and if not whether it is equal or unequal to the second list.
"""
def compare([], []), do: :equal
def compare([], _), do: :sublist
def compare(_, []), do: :superlist
def compare(a, b) do
a_len = length(a)
b_len = length(b)
cond do
a_len == b_len -> if a == b, do: :equal, else: :unequal
a_len > b_len -> if list_contains?(a, b, a_len, b_len), do: :superlist, else: :unequal
a_len < b_len -> if list_contains?(b, a, b_len, a_len), do: :sublist, else: :unequal
true -> :unequal
end
end
defp list_contains?(_, _, big_len, small_len) when big_len < small_len, do: false
defp list_contains?(big, small, big_len, small_len) do
List.starts_with?(big, small) or list_contains?(tl(big), small, big_len - 1, small_len)
end
end
'호두나무 공방 > Exercism in Elixir' 카테고리의 다른 글
Basketball Website - Exercism in Elixir (0) | 2022.04.28 |
---|---|
Resistor Color Trio - Exercism in Elixir (0) | 2022.04.22 |
Gigasecond - Exercism in Elixir (0) | 2022.04.20 |
Library Fees - Exercism in Elixir (0) | 2022.04.19 |
Bob - Exercism in Elixir (0) | 2022.04.18 |