애너그램

애너그램

보통

소개

벼룩시장에서 멋진 빈티지 타자기를 헐값에 발견했어요! 신이 나서 집으로 달려가 종이 한 장을 끼우고 타자를 두드리기 시작했어요. 그런데 출력된 결과를 보고 나니 신바람이 가라앉았어요. 모든 단어가 뒤죽박죽이었거든요! 예를 들어 "post" 대신 "stop"을, "stale" 대신 "least"를 찍어 냈어요. 조심스럽게 다시 시도해 봤지만 이번에는 "spot"과 "slate"를 찍어 냈어요. 몇 번 실험해 보니 글자마다 인쇄되기 전에 무작위 지연이 생겨서 순서가 엉망이 되는 거였어요. 이제 왜 그렇게 싸게 팔았는지 이해가 됐어요!

이 특이한 점 덕분에 애너그램, 즉 다른 단어의 글자를 재배열해 만든 단어를 만들 수 있다는 걸 깨달았어요. 발견이 기뻐서 남은 하루를 애너그램 수백 개를 만들며 보냈어요.

지침

목표 단어와 후보 단어 집합이 주어지면, 후보 중 목표 단어의 애너그램인 것들로 이루어진 부분 집합을 찾는 것이 과제예요.

애너그램은 글자를 다시 배열해 새로운 단어를 만드는 것이에요: 예를 들어 "owns"는 "snow"의 애너그램이에요. 단어는 자기 자신의 애너그램이 아니에요: 예를 들어 "stop"은 "stop"의 애너그램이 아니에요.

목표 단어와 후보는 하나 이상의 ASCII 알파벳 문자(A-Z, a-z)로 이루어진 단어예요. 소문자와 대문자는 서로 같게 취급해요: 예를 들어 "PoTS"는 "sTOp"의 애너그램이지만, StoP는 sTOp의 애너그램이 아니에요. 애너그램 집합은 후보 집합 중 목표 단어의 애너그램인 것들의 부분 집합이에요(순서는 상관없어요). 애너그램 집합에 있는 단어는 후보 집합에서와 같은 대소문자를 유지해야 해요.

목표 단어가 "stone"이고 후보가 "stone", "tones", "banana", "tons", "notes", "Seton"이라면, 애너그램 집합은 "tones", "notes", "Seton"이에요.

힌트

이 연습 문제를 완료하려면 anagramsFor 함수를 구현해야 해요. 이 함수는 단어 하나와 단어들의 묶음을 받아서, 주어진 단어의 애너그램인 것들을 반환해요.

애너그램은 후보 단어들에 나열된 순서 그대로 반환해야 해요.

이 연습 문제를 처음 푼다면, 제공된 시그니처를 그대로 사용하는 걸 추천해요:

anagramsFor :: String -> [String] -> [String]

나중에 이 문제를 다시 풀어보면서 다른 데이터 타입과 라이브러리도 다뤄보면 좋아요:

  • text 패키지의 Text
  • containers 패키지의 Sequence와 Set
  • multiset 패키지의 MultiSet

테스트 스위트는 의미가 통하는 거의 모든 타입 시그니처를 허용하도록 의도적으로 설계되었으니, 가장 좋다고 생각하는 시그니처를 찾아보길 권해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Haskell Exercism

애너그램 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Haskell 트랙을 연습 문제 107개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.