주어진 문장이 팬그램(Pangram)인지 아닌지를 판별하는 것이 이번 포스팅의 목표입니다. 팬그램이란 알파벳 'a'부터 'z'까지 모든 글자를 최소 한 번 이상 포함하고 있는 문장을 의미합니다. 대표적인 예로 영어 알파벳 26글자가 모두 등장하는 "The quick brown fox jumps over the lazy dog" 같은 문장이 있습니다.
이 문제는 파이썬의 set() 메서드와 리스트 컴프리헨션(list comprehension) 기법을 활용하면 간단하게 해결할 수 있습니다.
예제
입력: string = 'abc def ghi jkl mno pqr stu vwx yz' 출력: Yes // 'a'부터 'z'까지 모든 문자를 포함 입력: string = 'python program' 출력: No // 'a'부터 'z'까지 모든 문자를 포함하지 않음
알고리즘
1단계: 문자열을 생성한다. 2단계: lower() 메서드를 사용해 전체 문장을 소문자로 변환한다. 3단계: 입력 문자열을 set()으로 변환하여 문장에 포함된 모든 고유한 문자 목록을 얻는다. 4단계: ord() 함수(문자의 ASCII 값을 반환)를 이용해 알파벳만 분리한다. 5단계: 리스트의 길이가 26이면 모든 문자가 존재하므로 팬그램이고, 그렇지 않으면 팬그램이 아니다.
예제 코드
def checkPangram(s):
lst = []
for i in range(26):
lst.append(False)
for c in s.lower():
if not c == " ":
lst[ord(c) - ord('a')] = True
for ch in lst:
if ch == False:
return False
return True
# Driver Program
str1 = input("문자열을 입력하세요 ::> ")
if (checkPangram(str1)):
print('"' + str1 + '"')
print("is a pangram")
else:
print('"' + str1 + '"')
print("is not a pangram")
실행 결과
문자열을 입력하세요 ::> abc def ghi jkl mno pqr stu vwx yz "abc def ghi jkl mno pqr stu vwx yz" is a pangram 문자열을 입력하세요 ::> python program "python program" is not a pangram
더 간결한 방법: set 비교 활용하기
위 코드를 더 짧게 작성하고 싶다면 집합(set)의 부분집합 연산을 활용할 수 있습니다. 알파벳 소문자 전체 집합이 입력 문장의 문자 집합에 포함되어 있는지만 확인하면 됩니다.
import string
def is_pangram(s):
return set(string.ascii_lowercase) <= set(s.lower())
print(is_pangram("the quick brown fox jumps over the lazy dog")) # True
print(is_pangram("python program")) # False
string.ascii_lowercase는 'abcdefghijklmnopqrstuvwxyz' 문자열을 제공하며, 이를 집합으로 변환한 뒤 입력 문장의 문자 집합과 비교하면 한 줄로 팬그램 여부를 판별할 수 있습니다.
마무리
팬그램 검사는 문자열 처리와 집합 자료구조를 연습하기에 좋은 예제입니다. 핵심은 대소문자 통일 → 중복 제거 → 알파벳 개수 확인의 흐름을 이해하는 것입니다. 위 두 가지 방법 중 상황에 맞는 방식을 선택해 활용해 보시기 바랍니다.