블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 383. Ransom Note를 풀고 작성한 글입니다.
Given two strings ransomNote
and magazine
, return true
if ransomNote
can be constructed by using the letters from magazine
and false
otherwise.
Each letter in magazine
can only be used once in ransomNote
.
1 <= ransomNote.length, magazine.length <= 10^5
ransomNote
and magazine
consist of lowercase English letters.해시 테이블 -파이썬에서의 딕셔너리- 을 사용해서 문자를 키로 개수를 값으로 저장한 다음 이를 비교하여 문제를 해결할 수 있다.
입력값 ransomNote
를 기준으로 해시 테이블을 만들면 아래와 같이 문제를 해결할 수 있다.
def solution(ransomNote: str, magazine: str) -> bool:
characters: dict[str, int] = {}
for character in ransomNote:
if character in characters:
characters[character] += 1
else:
characters[character] = 1
for character in magazine:
if character in characters and characters[character] > 0:
characters[character] -= 1
return True if sum(characters.values()) == 0 else False
입력값 magazine
을 기준으로 해시 테이블을 만들면 조금 더 단순하게 문제를 해결할 수 있다.
def solution(ransomNote: str, magazine: str) -> bool:
characters: dict[str, int] = {}
for character in magazine:
if character in characters:
characters[character] += 1
else:
characters[character] = 1
for character in ransomNote:
if character not in characters or characters[character] == 0:
return False
else:
characters[character] -= 1
return True
해시 테이블 조회의 경우 상수 시간이기 때문에 시간 복잡도는 최종적으로 반복문 수행에 따라 O(N)이다.
이때 N은 두 입력값 중 길이가 더 긴 문자열에 대한 길이다.