Skip to main content

Valid Anagram

문제

두 문자열 s와 t가 주어질 때, t가 s의 아나그램이면 true를 반환하고, 그렇지 않으면 false를 반환하세요. 아나그램은 다른 단어나 문장의 문자들을 재배열하여 만든 단어나 문장을 의미하며, 원래의 모든 문자를 정확히 한 번만 사용합니다.

접근 방향

이전 문제와 동일하게 s 문자열이 가진 각 단어들을 키로 갖고 반복 횟수를 밸류로 갖도록 map 자료형에 저장하고 t 문자열을 순회하면서 동일한 단어들의 경우 반복 횟수를 의미하는 밸류를 1씩 차감하도록 한다. 하지만 이전 문제와 다르게 t가 가진 단어와 s가 가진 단어 모두 일치해야 하므로 t 문자열이 가진 단어 중 s 문자열의 단어와 겹치는 부분이 없다면 map 자료형에 신규로 추가하도록 하여 t 문자열이 s 문자열이 가지고 있지 않은 단어를 가지고 있을 경우에 False를 반환하도록 한다.

나의 풀이

class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(set(s)) > len(t):
return False

alphaMap = {}

# s 문자열을 순회하면서 각 단어를 키로 갖고 반복횟수를 밸류로 갖도록 map에 저장
for word in s:
if word in alphaMap:
alphaMap[word] += 1
else:
alphaMap[word] = 1

# t 문자열을 순회하면서 s 문자열이 갖고 있는 단어와 일치할 경우 밸류를 1 차감하며
# 일치하는 부분이 없을 경우 신규 생성, 이 경우 같은 값이 반복되더라도 값을 더 추가하지는 않는다.
for word in t:
if word in alphaMap:
alphaMap[word] -= 1
else:
alphaMap[word] = 1

# alphaMap의 모든 밸류값은 반복횟수를 의미하므로 0보다 큰 값이 있을 경우
# 아나그램이 성립하지 않으므로 False 반환
for repeat_count in alphaMap.values():
if repeat_count != 0:
return False

return True

다른 사람의 풀이

class Solution(object):
def isAnagram(self, s, t):

# 길이가 일치하지 않을 경우 아나그램 성립 불가이므로 False 반환
if len(s) != len(t):
return False

# s 문자열이 가진 각 단어의 유니크한 값을
# s가 가지고 있는 개수와 t가 가지고 있는 개수가 동일하지 않을 경우 False 반환
for idx in set(s):

if s.count(idx) != t.count(idx):
return False
return True