알고리즘 - 보석과 돌
돌에는 보석이 몇 개나 있을까? 대소문자는 구분한다.
Input | Output |
---|---|
jewels = “aA”, stones = “aAAbbbb” | 3 |
Solution1 (해시 테이블을 이용한 풀이)
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
freqs = {}
count = 0
for char in stones:
if char not in freqs:
freqs[char] = 1
else:
freqs[char] += 1
for char in jewels:
if char in freqs:
count += freqs[char]
return count
돌 각각의 개수를 모두 헤아린 다음 보석의 각 요소를 키로 하는 각 개수를 합산하면 된다.
해시 테이블로 풀이할 수 있는 전형적인 문제이다.
Solution2 (defaultdict를 이용한 비교 생략)
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
freqs = collections.defaultdict(int)
count = 0
for char in stones:
freqs[char] += 1
for char in jewels:
if char in freqs:
count += freqs[char]
return count
존재하지 않는 키에 대해 디폴트를 리턴해 주는 defaultdict을 사용하여 비교하는 과정을 생략했다.
Solution3 (Counter로 계산 생략)
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
freqs = collections.Counter(stones)
count = 0
for char in jewels:
count += freqs[char]
return count
Counter는 존재하지 않는 키의 경우 KeyError를 발생시키는 게 아니라 0을 출력해 주기 때문에 defaultdict과 마찬가지로 예외 처리를 할 필요가 없다.
Solution4 (파이썬다운 방식)
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
return sum(s in jewels for s in stones)
# [s for s in stones] => ['a', 'A', 'A', 'b', 'b', 'b', 'b']
# [s in jewels for s in stones] => [True, True, True, False, False, False, False]
# sum(s in jewels for s in stones) => True의 개수를 세어준다
# 리스트 컴프리헨션을 의미하는 앞뒤의 대괄호는 제거할 수 있다.
댓글남기기