leetcode 771

Lee Hyun Joon ·2022년 7월 28일

알고리즘정리

목록 보기
10/17

문제 해석

stones들 중, jewels들의 개수를 구하는 문제입니다.

1번째 접근 방식

-> 실제 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))

2번째 접근 방식

-> 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 

3번째 접근방식

-> 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번째부터 순서대로, 더 나은 방식을 찾고자 찾아보면서 구현했습니다.

profile
우당탕탕 개발 지망생

0개의 댓글