이 글에서는 주어진 문자 집합을 사용해 만들 수 있는 단어를 출력하는 파이썬 프로그램을 살펴보겠습니다. 여기서는 참조 단어들이 담긴 리스트 하나와, 단어를 구성하는 데 사용할 문자들이 담긴 또 다른 리스트를 입력으로 받습니다.
아래 프로그램에서는 두 개의 함수를 정의합니다. 첫 번째 함수는 문자 목록의 글자들을 이용해 단어를 구성할 수 있는지 판단하기 위한 기준을 마련하고, 두 번째 함수는 만들어진 단어가 주어진 단어 목록에 속하는지 확인하여 매칭합니다.
예제 코드
def Possible_Words(character):
x = {}
for n in character:
x[n] = x.get(n, 0) + 1
return x
def character_set(w, character):
for char in w:
value = 1
m = Possible_Words(char)
for k in m:
if k not in character:
value = 0
else:
if character.count(k) != m[k]:
value = 0
if value == 1:
print(char)
data = ['fat','tap','day','fun','man','ant','bag','aim']
words = ['m','t','e','d','f','a','p','y','i']
character_set(data, words)
코드 설명
Possible_Words 함수는 단어 하나를 인자로 받아 그 단어에 포함된 각 문자의 등장 횟수를 딕셔너리 형태로 반환합니다. 예를 들어 'fat'이 입력되면 {'f': 1, 'a': 1, 't': 1}과 같은 결과가 나옵니다.
character_set 함수는 단어 목록과 문자 목록을 차례대로 검사합니다. 각 단어를 구성하는 모든 문자가 문자 목록에 존재하고, 필요한 개수만큼 충분히 들어 있는지 확인한 뒤, 조건을 만족하는 단어만 화면에 출력합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
fat tap day aim
참고: Counter를 활용한 더 간결한 방법
파이썬 표준 라이브러리인 collections.Counter를 사용하면 동일한 로직을 훨씬 간결하게 작성할 수 있습니다.
from collections import Counter
def character_set(words, characters):
char_count = Counter(characters)
for word in words:
word_count = Counter(word)
if all(char_count[k] >= v for k, v in word_count.items()):
print(word)
data = ['fat','tap','day','fun','man','ant','bag','aim']
words = ['m','t','e','d','f','a','p','y','i']
character_set(data, words)
Counter는 문자별 개수를 자동으로 계산해 주므로 직접 딕셔너리를 만드는 번거로움이 사라지고, 가독성과 유지보수 측면에서도 유리합니다. 실무에서는 이처럼 표준 라이브러리를 적극 활용하는 것이 좋습니다.