Set a는 a 타입의 중복되지 않는 값들의 나열이에요.
값들은 comparable 타입이어야 해요 (Int, Float, Time, Char, String, 그리고 비교 가능한 타입들의 튜플이나 배열).
Set.toList와 Set.fromList를 사용하면 배열과 Set을 서로 변환할 수 있어요.
Set은 내부 구조상 Set.fromList로 만든 배열이 항상 정렬된다는 것이 보장돼요.
Set.fromList [2, 3, 3, 3, 1, 1, 2]
--> Set.fromList [1, 2, 3]
Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
--> [1, 2, 3]
Set.empty, Set.singleton, Set.insert, Set.remove로 Set을 만들고 값을 채울 수 있어요.
Set.empty
--> Set.fromList []
Set.singleton "hi"
--> Set.fromList ["hi"]
eightyEight = Set.singleton 88
Set.insert 88 eightyEight
--> Set.fromList [88]
Set.insert 89 eightyEight
--> Set.fromList [88, 89]
Set.remove 88 eightyEight
--> Set.fromList []
Set.remove 89 eightyEight
--> Set.fromList [88]
Set.member, Set.isEmpty, Set.size 함수로 Set의 내용을 확인할 수 있어요.
Set.member 88 eightyEight
--> True
Set.isEmpty eightyEight
--> False
Set.size eightyEight
--> 1
Set은 Set.union, Set.intersect, Set.diff로 결합할 수 있어요.
a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Set.union a b
--> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
Set.intersect a b
--> Set.fromList [1, 10]
Set.diff a b
--> Set.fromList [100]
Set.diff b a
--> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]
Set은 필터링하고 분할할 수도 있어요.
even n = modBy 2 n == 0
Set.filter even b
--> Set.fromList [2, 4, 6, 8, 10]
Set.partition even b
--> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])
Blorkemon™️ 카드에 대한 향수가 좀처럼 가라앉지 않네요. 심지어 다시 카드를 모으기 시작했고, 친구들까지 함께 끌어들이고 있어요.
이 연습 문제에서 Card 컬렉션은 Set Card로 표현돼요. 존재하는 모든 카드를 모으는 것이 목표일 때는 중복된 카드가 중요하지 않기 때문이죠.
친구들도 Blorkemon™️ 열풍에 빠지게 하고 싶은 마음이 크죠? 가장 좋은 방법은 카드 한 장을 선물해서 친구의 컬렉션을 시작해 주는 거예요.
카드 한 장을 컬렉션으로 바꿔 주는 newCollection을 구현해요.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
컬렉션을 한 번 만들면 컬렉션은 자기만의 생명력을 얻고, 계속 커져야 해요.
Card와 컬렉션을 받아서 두 값이 담긴 Tuple을 반환하는 addCard를 구현해요. 첫 번째는 Card가 컬렉션에 이미 있었는지를 나타내는 Bool이고, 두 번째는 카드가 추가된 컬렉션이에요.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
친구들이 다시 Blorkemon™️에 푹 빠졌으니, 이제 카드를 교환해서 자기 컬렉션을 키울 수 있어요.
모든 교환이 할 가치가 있는 것도 아니고, 아예 할 수 없는 교환도 있어요. 가지고 있지 않은 카드는 교환할 수 없고, 이미 가지고 있는 카드와 교환해서도 안 돼요.
교환할 두 카드(내 카드와 상대 카드)와 현재 컬렉션을 받는 tradeCard를 구현해요.
반환 값은 두 값이 담긴 Tuple이에요. 교환이 가능하고 할 가치가 있는지를 나타내는 Bool과, 실제로는 불가능하더라도 교환을 했다면 최종적으로 갖게 될 컬렉션이에요.
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
벼룩시장에서 오래된 카드 더미를 발견했어요. 목록을 컬렉션과 비교하려면 카드를 정렬하고 중복을 제거해야 해요.
카드 목록을 정렬해서, 중복이 제거된 정렬된 카드 목록을 반환하는 removeDuplicates를 구현해요.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
이제 자기 컬렉션에 뿌듯해할 시간이에요.
내 컬렉션과 다른 컬렉션을 받아서, 다른 컬렉션에 없는 카드의 개수를 반환하는 extraCards를 구현해요.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
Blorkemon™️에 열광하는 친구들과 모여서 어떤 카드가 가장 흔한지 궁금해해요.
컬렉션 목록을 받아서, 모든 컬렉션이 가지고 있는 카드를 정렬한 목록을 반환하는 boringCards를 구현해요.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
나와 친구들이 힘을 합치면 모든 Blorkemon™️ 카드를 가지고 있을까요?
컬렉션 목록을 받아서, 모든 컬렉션에 있는 서로 다른 카드의 총개수를 반환하는 totalCards를 구현해요.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
조카가 곧 놀러 온다고 해서, 한번 멋진 모습을 보여주고 싶어요. 아이들은 반짝이는 걸 좋아하잖아요? Blorkemon™️ 카드도 반짝일 수 있어요!
컬렉션을 받아서 정렬된 카드 목록 두 개가 담긴 Tuple을 반환하는 splitShinyCards를 구현해요. 하나는 "Shiny"로 시작하는 모든 카드, 다른 하나는 나머지 카드예요.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Exercism에 가입하고 Elm 트랙을 개념 28개연습 문제 110개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.