Problem From.
https://leetcode.com/problems/naming-a-company/
오늘 문제는 주어진 리스트 ideas 에서 각 글자를 뽑아서 앞 글자를 바꾸었을때,
그 단어가 둘다 ideas 안에 없으면 유효한 이름으로 생각하여 추가하는 문제였다.
이 문제는 안되는 경우를 생각해서 그 경우를 빼는 식으로 생각하면 됐었는데,
먼저 앞글자가 서로 같으면 제외를 시켜야한다.
또한, 앞글자를 제외한 글자가 서로 같으면 그 경우의 수도 제외하여야 한다.
그렇게해서 남은 경우를 구한 다음 두배를 해주면 답이 나온다.
idea 리스트에서 앞글자가 같은 글자들끼리 모은 리스트를 만든다. 그 리스트들을 각각 비교하는데 같은 요소가 있다면 제외하고 아래와 같은 식을 만든다.
(첫번째 리스트 크기 - 같은 요소의 수) (두번째 리스트 크기 같은 요소의 수)
이러면 다른 이름의 조합이 나오는데, 그 다른 이름의 조합은 앞뒤가 바뀔 수 있으므로 두배를 해준다. 위 연산을 모든 리스트에 한번씩 해주면 답을 얻을 수 있다.
class Solution {
fun distinctNames(ideas: Array<String>): Long {
var num = 0L
val ideasMap = ideas.groupBy ({ it[0] },{it.removeRange(0 until 1) }).values.toList()
for(i in ideasMap.indices){
for(j in i+1 until ideasMap.size){
val intersectTwoList = ideasMap[i].intersect(ideasMap[j].toSet()).size
num += (2 * (ideasMap[i].size-intersectTwoList ) * ((ideasMap[j].size)-intersectTwoList))
}
}
return num
}
}