문제 : 

 

문제는 간단하다. 두개의  문자열이 주어지고, 두 문자열에서 두번 이상 나타나지 않는 단어들을 리스트로 반환하면 된다.

 

항상 생각한다. 특정 요소의 출현 횟수를 비교, 연산하는 자료구조는 해시테이블이 먼저 떠오른다.

 

아래는 내가 제출해 통과한 코드이다.

 

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이다.

 

+ Recent posts