본문 바로가기
LeetCode/Array & Hashing

[LeetCode][Kotlin] 242. Valid Anagram

by jinwo_o 2024. 8. 12.

242. Valid Anagram

Given two strings s and t, return true if t is an anagram of s, and false otherwise.

두 개의 문자열 s와 t가 주어졌을 때, t가 s의 애너그램이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

 

Example 1:

Input: s = "anagram", t = "nagaram"

Output: true

 

Example 2:

Input: s = "rat", t = "car"

Output: false

 

Constraints:

  • 1 <= s.length, t.length <= 5 * 10^4
  • s and t consist of lowercase English letters.

코드 1

  • 아나그램은 두 단어나 구문이 문자와 문자 개수가 같고, 순서가 다른 경우를 의미한다.
  • 즉, 정렬한 두 문자열이 같다면 아나그램이다.
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        return if (s.toList().sorted() == t.toList().sorted()) true else false
    }
}

 

코드 2

  • t 가 s 의 아나그램이면, t 에서 s 문자열의 문자만큼 제거했을 때 남아있는 문자는 없어야 한다.
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        val t = t.toMutableList()
        for (c in s) {
            if (c !in t) {
                return false
            }
            t.remove(c)
        }
        return t.size == 0
    }
}

 

코드 3

  • t 와 s 문자열의 문자와 문자의 개수를 확인하기 위해 아스키코드 값을 활용한다.
  • s 문자열의 문자는 개수를 늘리고, t 문자열의 문자는 개수를 줄이도록 한다.
  • t 가 s 의 아나그램이면, 모든 아스키코드 값의 개수는 0 이어야 한다.
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        if (s.length != t.length) return false
        
        val arr = IntArray(26)
        for (i in s.indices) {
            arr[s[i] - 'a']++
            arr[t[i] - 'a']--
        }
        
        return arr.all { it == 0 }
    }
}

 

코드 4

  • s 문자열의 문자들 개수와 t 문자열의 문자들 개수를 측정한다.
  • t 가 s 의 아나그램이면, s 문자열의 문자들 개수만큼 t 도 가지고 있어야 한다.
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        if (s.length != t.length) return false
        val countS = HashMap<Char, Int>()
        val countT = HashMap<Char, Int>()

        for (i in 0..s.lastIndex) {
            countS[s[i]] = countS.getOrDefault(s[i], 0) + 1
            countT[t[i]] = countT.getOrDefault(t[i], 0) + 1
        }

        for (c in countS.keys) {
            if (countS[c]!! != countT.getOrDefault(c, 0)) {
                return false
            }
        }
        
        return true
    }
}