https://leetcode.com/problems/jewels-and-stones/
문제
You're given strings jewels representing the types of stones that are jewels, and stones representing the stones you have. Each character in stones is a type of stone you have. You want to know how many of the stones you have are also jewels.
주어진 문자열 jewels는 보석의 종류를 나타내고, stones는 당신이 갖고 있는 돌의 종류를 나타낸다.
각 stones의 문자는 당신이 갖고 있는 돌의 종류를 나타낸다. 당신은 갖고 있는 돌 중에 보석이 몇 개나 있을지 알고싶다.
Letters are case sensitive, so "a" is considered a different type of stone from "A".
대소문자 구분됨!
Example 1:
Input: jewels = "aA", stones = "aAAbbbb"
Output: 3
Example 2:
Input: jewels = "z", stones = "ZZ"
Output: 0
문제 이해
1. jewels와 stones의 문자를 하나씩 비교해서, 같은 것의 갯수를 세면 될 것 같다는 간단한 결론이 나왔다.
2. 문제 이해는 금방 했는데, 해시테이블을 오늘 배웠으니 해시 테이블을 사용해서 풀어야 할 것 같은데 어떻게 풀면 좋을까 ... 하는 생각을 더 오래 한 것 같다. 해설을 보니 해시 함수로 인덱스 처리를 해 주지 않아도 해시 테이블이라고 명명하는 것 같다.
문제 풀이
1. 먼저 'table'이라는 빈 딕셔너리를 선언해준다. 이 딕셔너리는 돌의 종류를 key로 가지고, 해당 돌의 빈도수를 value로 가진다.
2. 'stones'의 각 돌에 대한 반복문을 수행하면서 (for문), 해당 돌이 'table' 딕셔너리에 이미 존재하는지 확인한다. (if문)
- 이미 존재하지 않는 경우, 새로운 key를 추가하고 빈도수를 1로 초기화한다.
- 이미 존재하는 경우, 해당 돌의 빈도수를 1 증가시킨다.
for stone in stones:
if stone not in table:
table[stone] = 1
else:
table[stone] += 1
3. 'jewels'의 각 보석에 대해 반복문을 수행하면서, 해당 보석이 'table' 딕셔너리에 존재하는지 확인한다.
- 존재하는 경우, 해당 보석의 빈도수를 'count'에 더해준다.
count = 0 # 변수 초기화
for jewel in jewels:
if jewel in table:
count += table[jewel]
4. 'count' 반환
정답 코드
해시 테이블을 이용한 풀이
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
table = {} # table이라는 빈 딕셔너리 선언
for stone in stones: # stones의 각 돌에 대해 반복문을 수행 > 해당 돌이 table 딕셔너리에 이미 존재하는지 확인
if stone not in table: # 테이블 안에 stone인덱스가 없다면,
table[stone] = 1 # 해당 인덱스 생성 후 1 넣어준다.
else:
table[stone] += 1 # 테이블 안에 stone인덱스가 있는데 같은 값이 들어왔다면, +1
count = 0 # 변수 초기화
for jewel in jewels:
if jewel in table: # table 안에 해당 인덱스를 골라서 count에 합산해줌
count += table[jewel]
return count
좀 더 파이써닉한 풀이
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
return sum(stone in jewels for stone in stones) # for문을 한 줄로 적어 합친 코드
마치며
반복문 안에서 조건문 써줄 때 jewel을 jewels라고 했다가 wrong answer가 났었다 ..ㅎㅎ 정신차리고 하자잉 ^^7
'Algorithm > LeetCode' 카테고리의 다른 글
[leetcode 198. python] 집 도둑 (House Robber) 풀이 (1) | 2024.01.23 |
---|---|
[leetcode 206.python] 역순 연결 리스트 (Reverse Linked List) 풀이 (0) | 2024.01.08 |
[leetcode 225.python] 큐를 이용한 스택 구현 (Implement Stack using Queues) 풀이 (0) | 2024.01.04 |
[leetcode 561.python] 배열 파티션 1(Array-partition 1) 풀이 (2) | 2024.01.03 |
[leetcode 49.python] 그룹 애너그램 (Group Anagrams) 풀이 (2) | 2024.01.03 |