호두나무 공방/Exercism in Elixir

Matching Brackets - Exercism in Elixir

2022. 7. 20. 22:04

문제 보기

재귀 처리를 익히는 기본 문제 중 하나인 괄호 짝 맞추기 문제다. 다 풀고 나서 생각해보니 String.graphemes로 문자열을 리스트로 만들고 리스트 패턴 매칭을 하는 게 코드상으로는 조금 더 간단했을 것 같은데, 왜인지 바이너리 패턴 매칭을 써야겠다 싶었다. 연습도 되고 좋았다.

defmodule MatchingBrackets do
  @doc """
  Checks that all the brackets and braces in the string are matched correctly, and nested correctly
  """
  @spec check_brackets(String.t()) :: boolean
  def check_brackets(str) do
    do_check(str, [])
  end

  defp do_check("", []), do: true
  defp do_check("", _), do: false
  defp do_check(<<h::utf8, t::binary>>, acc) when <<h>> not in ["(", "{", "[", "]", "}", ")"] do
    do_check(t, acc)
  end
  defp do_check(<<h::utf8, t::binary>>, acc) when <<h>> in ["(", "{", "["] do
    do_check(t, [<<h>> | acc])
  end
  defp do_check(")" <> t, ["(" | acc]), do: do_check(t, acc)
  defp do_check("}" <> t, ["{" | acc]), do: do_check(t, acc)
  defp do_check("]" <> t, ["[" | acc]), do: do_check(t, acc)
  defp do_check(_, _), do: false
end