stones들 중, jewels들의 개수를 구하는 문제입니다.
-> 실제 jewel가 문자열로 들어왔으니, set으로 바꿔줍니다. (search 시간이 낮다고 판단해서)
그리고 stones들을 loop하면서 jewel이면 +1을 해줍니다.
import collections
def numJewelsInStones(jewels: str, stones: str) -> int:
jewels_lst = set(jewels)
result = 0
print(jewels_lst)
for stone in stones:
if stone in jewels_lst:
result +=1
return result
jewels = 'aA'
stones = "aAAbbbb"
print(numJewelsInStones1(jewels,stones))
-> defaultdict을 사용하면 장점은 keyError가 발생하지 않는다는 점입니다.
def numJewelsInStones(jewels: str, stones: str) -> int: # defaultdict 사용
freq = collections.defaultdict(int) # int형 초기화
for stone in stones:
freq[stone] +=1
#stone들끼리 분류해서 개수를 저장해줍니다.
#이때 keyError가 나타나지 않고, 0으로 초기화된 상태에서 자동으로 더해줍니다.
result = 0
for s in jewels:
result += freq[s] # jewel 중 freq에서 count됬던 값들을 더해준다.
return result
-> Counter도 keyError가 발생하지 않으면서 counter를 사용함으로써 2번째 접근방식에서 stone 분류과정을 안해줘도 됩니다.
def numJewelsInStones(jewels: str, stones: str) -> int: # counter 사용
freq = collections.Counter(stones)
result = 0
for s in jewels:
if s in freq.keys():
# 사실 defaultdict과 counter 모두 keyerror의 문제가 없어서 if문 없어도 문제 X.
result += freq[s]
return result
위 세 방식은 1번째부터 순서대로, 더 나은 방식을 찾고자 찾아보면서 구현했습니다.