Skip to content

Commit 5a2d2a1

Browse files
committed
feat: valid-anagram 풀이 추가 (Counter 해싱)
1 parent 288366e commit 5a2d2a1

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

valid-anagram/unpo88.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from collections import Counter
2+
3+
4+
class Solution:
5+
def isAnagram(self, s: str, t: str) -> bool:
6+
if len(s) != len(t):
7+
return False
8+
9+
return Counter(s) == Counter(t)
10+
"""
11+
================================================================================
12+
풀이 과정 - 08:27 시작 ~ 08:32 종료 (5분 소요)
13+
================================================================================
14+
15+
1. s, t 문자열이 주어지는데
16+
2. s와 t가 anagram이면 True, 그렇지 않으면 False 반환
17+
3. anagram이란 어떤 단어나 구의 글자들을 모두 한 번씩만 사용하여 순서를 바꾸어 새롭게 만든 단어나 구
18+
4. 그러면 문자 정렬을 해서 같은지 비교를 하는 방법이 있을 것 같고
19+
5. 근데 그렇게 하면 문자 정렬에 시간 복잡도가 증가하니까
20+
6. 각 문자의 개수를 카운팅하는 해싱 Counter를 이용해서
21+
7. 서로의 키 값이 동일한지 확인한다거나 하면 조금 더 빠르게 처리가 가능할듯?
22+
23+
24+
[1차 시도] 반복문으로 직접 비교
25+
────────────────────────────────────────────────────────────────────────────────
26+
8. Counter로 각 문자의 개수를 세서 비교하는 방식 구현
27+
28+
if len(s) != len(t):
29+
return False
30+
s_count = Counter(s)
31+
t_count = Counter(t)
32+
33+
for key, value in s_count.items():
34+
if value != t_count[key]:
35+
return False
36+
return True
37+
38+
9. 정상적으로 통과되는 것 확인 완료
39+
40+
41+
[2차 개선] Counter 객체 직접 비교
42+
────────────────────────────────────────────────────────────────────────────────
43+
10. Counter 객체끼리 직접 비교가 가능하다는 것을 알게 됨
44+
11. 반복문 제거하고 더 간결하게 개선
45+
46+
if len(s) != len(t):
47+
return False
48+
49+
return Counter(s) == Counter(t)
50+
51+
12. 코드가 더 간결해지고 가독성도 향상됨
52+
13. 최종 통과 확인 완료
53+
14. 근데 그럼에도 len 길이를 비교하는것은 O(1) 측면에서 좋다는 답변도 받음
54+
55+
[다른 풀이 탐구] Counter를 사용하지 않고 직접 딕셔너리를 만들어서 처리한다면?
56+
────────────────────────────────────────────────────────────────────────────────
57+
counter = {}
58+
if len(s) != len(t):
59+
return False
60+
61+
for char in s:
62+
counter[char] = counter.get(char,0) + 1
63+
64+
for char in t:
65+
counter[char] = counter.get(char,0) - 1
66+
if counter[char] < 0:
67+
return False
68+
69+
return True
70+
71+
[다른 풀이 탐구] s와 t는 소문자만 받아올 수 있는데 그러면, 배열로 소문자 개수만큼 인덱싱해서 처리하는 방법도?
72+
────────────────────────────────────────────────────────────────────────────────
73+
"""

0 commit comments

Comments
 (0)