리트코드, Jewels and Stones_보석과 돌
TL;DR
- 해시(해시 테이블/맵, 딕셔너리)을 사용하여 주어진 문제를 풀 수 있는지
문제 분석
1. jewels : 각 글자는 보석에 해당하는 돌을 나타낸다.
2. stones : 각 글자는 내가 보유하고 있는 돌을 나타낸다.
3. 내가 갖고 있는 돌 중 보석이 몇 개나 있는지를 반환하라.
4. 'a'와 'A'는 서로 다른 종류의 돌로 간주한다.
- 내가 보유하고 있는 돌인 stones에서 jewels에 있는, 보석인 돌을 얼마나 갖고 있는지를 파악하는 문제이다.
- 내가 보유한 돌의 종류를 key로, 돌의 개수를 value로 하는 딕셔너리(dictionary)로 생각하면 문제를 해결할 수 있다.
입출력 형태
- 예시 1
- 내가 보유한 돌은 a 1개, A 2개, b 4개이다.
- 이 중 보석인 돌은 a와 A이다.
- 따라서 내가 보유하고 있는 돌 중 보석인 돌은 a와 A이므로, 3을 반환한다.
- 예시 2
- 내가 보유한 돌은 Z 2개이다.
- 이 중 보석인 돌은 z로, 내가 보유한 돌에는 없다. 따라서 0을 반환한다.
풀이
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
stone_counter = Counter(stones)
answer = 0
for jewel in jewels:
answer += stone_counter[jewel]
return answer
- collections.Counter는 배열에 있는 원소를 key로, 개수를 value로 하는 딕셔너리이다. 이를 통해 손쉽게 각 돌의 개수를 얻어낼 수 있다.
- jewels의 원소를 key로 Counter를 조회하면 답을 얻어낼 수 있다.
개선된 풀이
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
return sum([s in jewels for s in stones])
- 현재 공부하고 있는 책인 '파이썬 알고리즘 인터뷰'에서 제안하는 보다 파이썬스러운(pythonic)한 풀이 방법을 소개하려고 한다.
- 내가 보유한 돌들인 stones에서 각 돌이 jewels에 들어 있는지 확인한다.
- 이 때, 돌이 존재한다면 배열에 True가 없다면 False가 추가된다.
- 따라서, 배열의 합은 더하게 되면 True인 값만 더해져서 동일한 결과를 얻을 수 있다.
반응형
'개발 > Algorithm' 카테고리의 다른 글
[리트코드] Longest Substring Without Repeating Characters(python) (0) | 2021.06.28 |
---|---|
[프로그래머스] 숫자의 표현(python) (0) | 2021.06.27 |
[리트코드] Design Circular Queue(python) (0) | 2021.06.23 |
[리트코드] Implement Queue using Stacks(python) (0) | 2021.06.22 |
[리트코드] Implement Stack using Queues(python) (0) | 2021.06.22 |