문제 :

문제는 간단하다. 두개의 문자열이 주어지고, 두 문자열에서 두번 이상 나타나지 않는 단어들을 리스트로 반환하면 된다.
항상 생각한다. 특정 요소의 출현 횟수를 비교, 연산하는 자료구조는 해시테이블이 먼저 떠오른다.
아래는 내가 제출해 통과한 코드이다.
class Solution:
def uncommonFromSentences(self, s1: str, s2: str) -> List[str]:
l1 = s1.split()
l2 = s2.split()
total_l3 = l1 + l2
count = Counter(total_l3)
count_dict = dict(count)
result = [key for key, value in count_dict.items() if value == 1]
return result
- 먼저, 문자열을 공백을 기준으로 나누어 리스트에 담아준다. 예를들어, "this apple is sweet"이라는 문자열을 .split()을 통해 나누면
list = ['this', 'apple', 'is', 'sweet']과 같이 될 것이다.
- 이제 입력값으로 받은 두개의 문자열을 공백을 기준으로 나누었으면, 두 문자열을 합친다. 여기서 합치는 이유는 다음과 같다:
- 내가 그 다음에 하려는 일은 딕셔너리 안에 각 문자열의 출현 횟수를 키 - 값 쌍으로 매핑시켜 넣고자 하는 것인데, 여기서 각 l1, l2 리스 트에는 문자열들이 한번밖에 들어가지 않으므로 어떤 문자열이 중복되어 나오는지 비교 할 수 없다. 예를들어, list = ['this', 'apple', 'is', 'sweet'] 여기서 각 문자열의 빈도를 계산하더라도 모두 1로 나온다(l2에 중복된 문자열이 있음에도 불구하고).
- 합친 리스트는 다음과 같을 것이다. total_l3:["this","apple","is","sweet","this","apple","is","sour"]. 이제, 파이썬의 Counter 딕셔너리를 활용해 각 문자열의 출현 횟수를 매핑지어 딕셔너리에 담아준다. 위처럼 counter = Counter(total_l3)을 하고 dict()를 통해 명시적으로 딕셔녀리로 형 변환을 해주면 이제 이 딕셔너리 안에는 각 문자열과 그에 맞는 빈도가 담겨 있을 것이다.
- 이제, result라는 배열에서 key for key, value in count_dict.items() if value == 1을 통해 문제의 조건에 맞는 값들을 리스트에 담아 반환한다.
여기서 다시한번 이 리스트 컴프리헨션을 살펴보자.
📎 리스트 컴프리헨션의 기본 구조
[new_item for item in iterable if condition]
여기서:
- `new_item`은 새로운 리스트에 추가될 항목이다.
- `item`은 `iterable`로부터 각 반복에서 추출된 항목이다.
- `iterable`은 리스트, 튜플, 딕셔너리, 집합 등 반복 가능한 객체이다.
- `condition`은 선택 사항으로, 특정 조건을 만족하는 항목만 새로운 리스트에 포함된다.
문제 설명
keys_with_value_1 = [key for key, value in count_dict.items() if value == 1]
이 구조를 풀어서 설명하면 다음과 같다:
1. `count_dict.items()`:
- 딕셔너리 `count_dict`의 모든 키-값 쌍을 반환한다.
- 예를 들어, `{'apple': 3, 'banana': 2, 'orange': 1}`라면 `count_dict.items()`는 `[('apple', 3), ('banana', 2), ('orange', 1)]`와 같다.
2. `for key, value in count_dict.items()`:
- 각 키-값 쌍을 순회하면서 `key`와 `value`에 할당한다.
- 예를 들어, 첫 번째 반복에서는 `key`가 `'apple'`, `value`가 `3`이다.
3. `if value == 1`:
- 값이 1인 경우에만 다음 단계로 진행한다.
- 예를 들어, `('orange', 1)` 쌍에서만 조건이 참이 된다.
4. `key`:
- 조건이 참인 경우, 해당 키를 새로운 리스트에 추가한다.
- 위 예제에서는 `'orange'`가 리스트에 추가된다.
🎈 전체 예제 코드
from collections import Counter
# 예제 리스트
total_l3 = ["apple", "banana", "apple", "orange", "banana", "apple"]
# Counter 객체 생성
count = Counter(total_l3)
# Counter 객체를 딕셔너리처럼 사용
count_dict = dict(count)
# 값이 1인 키들을 리스트로 추출
keys_with_value_1 = [key for key, value in count_dict.items() if value == 1]
# 결과 출력
print(keys_with_value_1)
```
### 실행 결과
['orange']
이정도면 쉽게 풀어 낼 수 있다. 아래는 내가 받은 report이다.

'CodingTest > Leetcode' 카테고리의 다른 글
[LeetCode] 961. N-Repeated Element in Size 2N Array (0) | 2024.07.03 |
---|---|
[LeetCode] 929. Unique Email Addresses (0) | 2024.07.02 |
[LeetCode] #819. Most Common Word (0) | 2024.06.28 |
[LeetCode] #804. Unique Morse Code Words (0) | 2024.06.27 |
[LeetCode] # 748. Shortest Completing Word (0) | 2024.06.26 |