집합은 중복되지 않는 값들을 담는 모음으로, 변경할 수 없고 순서가 없어요. 집합의 모든 항목은 같은 타입이어야 해요.
gleam/set 모듈은 Set 타입을 정의하고, 집합을 다루는 함수들을 제공해요.
set.to_list와 set.from_list로 리스트와 집합을 서로 변환할 수 있어요. 집합에서 항목의 순서는 보장되지 않아요.
set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])
set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]
set.new, set.insert, set.delete로 집합을 만들고 값을 채울 수 있어요.
set.new()
// -> set.from_list([])
let eighty_eight = set.from_list([88])
set.insert(eighty_eight, 88)
// -> set.from_list([88])
set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])
set.delete(eighty_eight, 89)
// -> set.from_list([88])
set.contains와 set.size 함수로 집합의 내용을 확인할 수 있어요.
set.contains(eighty_eight, 88)
// -> True
set.size(eighty_eight)
// -> 1
집합은 set.union과 set.intersection으로 결합할 수 있어요.
let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])
set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])
set.intersection(a, b)
// -> set.from_list([1, 5])
집합을 필터링할 수도 있어요.
let is_small = fn(n) { n <= 3 }
set.filter(b, is_small)
// -> set.from_list([1, 2, 3])
Blorkemon™️ 카드에 대한 향수가 가라앉을 기미가 보이지 않네요. 심지어 다시 카드를 모으기 시작했고, 친구들까지 함께 끌어들이고 있어요.
이 연습 문제에서 카드 컬렉션은 Set(String)으로 표현해요. 모든 카드를 모으는 것이 목표일 때는 중복된 카드가 중요하지 않기 때문이에요.
친구들도 Blorkemon™️ 열풍에 빠지게 하고 싶네요. 가장 좋은 방법은 카드 한 장을 선물해서 친구의 컬렉션을 시작해 주는 거예요.
카드를 컬렉션으로 바꾸는 new_collection을 구현해요.
new_collection("Newthree")
// -> set.from_list(["Newthree"])
일단 컬렉션이 생기면 컬렉션은 자기만의 생명력을 얻고, 계속 자라나야 해요.
카드와 컬렉션을 받아서 두 값을 가진 튜플을 반환하는 add_card를 구현해요. 두 값은 카드가 이미 컬렉션에 있었는지 나타내는 Bool과, 카드를 추가한 컬렉션이에요.
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
이제 친구들이 다시 Blorkemon™️에 푹 빠졌으니, 카드를 교환해서 자기 컬렉션을 키울 수 있어요.
모든 교환이 가치 있는 것도 아니고, 애초에 할 수 없는 교환도 있어요. 가지고 있지 않은 카드는 교환할 수 없고, 이미 가지고 있는 카드와 교환해서도 안 돼요.
교환할 두 카드(내 카드와 상대 카드)와 지금 가지고 있는 컬렉션을 받는 trade_card를 구현해요.
반환값은 두 값을 가진 튜플이에요. 교환이 가능하고 가치가 있는지 나타내는 Bool과, 교환을 했다면 최종적으로 갖게 될 컬렉션이에요(실제로 가능하지 않더라도요).
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
나와 Blorkemon™️ 열성 팬 친구들이 모여서 어떤 카드가 가장 흔한지 궁금해해요.
컬렉션의 리스트를 받아서 모든 컬렉션이 가지고 있는 카드의 정렬된 리스트를 반환하는 boring_cards를 구현해요.
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
나와 친구들이 힘을 합치면 모든 Blorkemon™️ 카드를 가지고 있을까요?
컬렉션의 리스트를 받아서 모든 컬렉션에 있는 서로 다른 카드의 총 개수를 반환하는 total_cards를 구현해요.
total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2
조카가 곧 놀러 오는데, 조카에게 멋진 모습을 보여주고 싶어요. 아이들은 반짝이는 것을 좋아하잖아요? Blorkemon™️ 카드는 반짝일 수 있어요!
컬렉션을 받아서 "Shiny "로 시작하는 모든 카드를 담은 집합을 반환하는 shiny_cards를 구현해요.
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.