[LeetCode]1657. Determine if Two Strings Are Close(Kotlin)
풀이1
- Operation 1,2를 적용하여 두 개의 문자열을 같게 만들 수 있다면 true, 없다면 false를 반환하는 문제
- 주어지는 두 개의 문자열을 알파벳 소문자로만 이루어짐
- Operation을 적용할 수 있는 횟수 제한 X
- Operation1: 문자열에 있는 2개의 문자를 swap할 수 있음
-> 문자열에 나타나는 문자 순서가 달라도
-> 두 문자열을 같게 만들 수 있음
- Operation2: 문자열에 존재하는 알파벳을 문자열에 존재하는 다른 알파벳으로 교체할 수 있음
-> 두 문자열에서 각 알파벳이 나타나는 횟수가 달라도,
두 문자열이 같은 알파벳 종류를 가지고 있고, 한 종류의 알파벳이 나타나는 횟수가 같다면
-> 두 문자열을 같게 만들 수 있음
class Solution {
fun closeStrings(word1: String, word2: String): Boolean =
wordToListPair(word1) == wordToListPair(word2)
private fun wordToListPair(word:String):Pair<List<Char>, List<Int>>{
val alphaMap = mutableMapOf<Char, Int>()
word.forEach{ ch ->
if(alphaMap.containsKey(ch)) alphaMap[ch] = alphaMap[ch]!! + 1
else alphaMap[ch] = 1
}
val charList = mutableListOf<Char>()
val charCntList = mutableListOf<Int>()
alphaMap.forEach{ entry ->
if(entry.value > 0){
charList.add(entry.key)
charCntList.add(entry.value)
}
}
return Pair(charList.sorted().toList(), charCntList.sorted().toList())
}
}
풀이2
- Kotlin Collection 함수를 이용한 풀이
class Solution {
fun closeStrings(word1: String, word2: String): Boolean =
wordToListPair(word1) == wordToListPair(word2)
private fun wordToListPair(word:String):Pair<List<Char>, List<Int>>{
val charList = word.toSet().toList()
val charCntList = word.groupBy{it}.map{it.value.size}
return Pair(charList.sorted(), charCntList.sorted())
}
}