Programming/leetcode

771. Jewels and Stones

홍열 2021. 2. 22. 10:31
728x90

jewel이 stone에 몇개 들어있는지 세어보는 문제 

 

1) 이중 for문

    int numJewelsInStones(string J, string S) {
        int cnt = 0;
        for (int i = 0; i<J.size(); i++) {
            for (int j = 0; j < S.size(); j++) {
                if (J[i] == S[j]) cnt++;
            }
        }
        return cnt;
    }

 

2) in을 이용

    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        cnt = 0
        for s1 in stones:
            if s1 in jewels:
                cnt += 1
        return cnt

 

3) dict 이용

        def numJewelsInStones(self, jewels:str, stones:str)->int:
        # J의 각 문자가 S에 몇개 들어있는지 파악하면 되는 문제
        freq = {}
        count = 0
        for ss in stones:
            if ss in freq:
                freq[ss] = 1
            else:
                freq[ss] += 1
        for char in jewels:
            if char in freq:
                count += freq[char]
        return count

 

4) dict 이용 (default dict 이용)

    def numJewelsInStones(self, jewels:str, stones:str)->int:
        # J의 각 문자가 S에 몇개 들어있는지 파악하면 되는 문제
        freq = collections.defaultdict(int)
        count = 0
        for ss in stones:
                freq[ss] += 1
        for char in jewels:
            if char in freq:
                count += freq[char]
        return count

 

5) Counter로 계산하자

    def numJewelsInStones(self, jewels:str, stones:str)->int:
        # J의 각 문자가 S에 몇개 들어있는지 파악하면 되는 문제
        freq = collections.Counter(stones)
        count = 0
        for char in jewels:
            if char in freq:
                count += freq[char]
        return counter

6) 근데 위 방법들보다 깔끔하고, 더 빠른 방법이 있다.

-> 리스트 컴프레션 이용

 

        #stones를 하나씩 가져와서 s에 넣어주고, s가 jewels에 있는지 확인하자
        #sum을 해보면, true일때만 count 증가
        return sum([s in jewels for s in stones])