이 글에서는 파이썬 3.x 이상 버전에서 주어진 문자열이 판그램(Pangram)인지 아닌지 판별하는 방법을 배워보겠습니다. 판그램이란 영어 알파벳의 모든 글자를 최소 한 번씩 포함하고 있는 문자열을 의미합니다. 아래 예시를 통해 살펴보겠습니다.
입력: str = 'This is the python blog on Tutorial point' 출력: No 입력: str = 'I want to contribute to a 'dxyzwuvghlkfmq' open source project' 출력: Yes
정의에 따르면 완전 판그램(perfect pangram)은 26개의 영어 알파벳 각각을 정확히 한 번씩만 사용하는 문장을 말합니다. 다만 이 튜토리얼에서는 완전 판그램 개념까지는 다루지 않습니다.
그럼 문제 상황과 제약 조건부터 살펴보겠습니다.
문제 정의
문제 − 주어진 문자열이 판그램인지 아닌지 확인합니다.
제약 조건
- 대문자와 소문자는 동일한 것으로 취급합니다.
- 앞서 언급한 완전 판그램 조건은 고려하지 않습니다.
입력: 첫 번째 줄에 테스트 문자열 'str_input'이 주어집니다.
출력: 조건이 참이면 'String is a Pangram'을 출력하고,
그렇지 않으면 'String is not a Pangram'을 출력합니다.관련 자료구조
Set()과 리스트 컴프리헨션(List Comprehension)
사전 지식
문자열(String)과 문자열 연산
알고리즘
이번 문제에서 구현할 알고리즘을 간단히 정리하면 다음과 같습니다.
- 먼저 입력받은 전체 문자열을 소문자 또는 대문자로 변환합니다. 여기서는 파이썬 문자열 자료형의 upper() 메서드를 사용해 대문자로 변환하겠습니다.
- 다음으로 set() 함수를 활용하면 입력 문자열에 포함된 중복 없는 고유 요소들의 집합을 만들 수 있습니다.
- 이제 숫자나 특수 문자를 제외한 알파벳만 담긴 새로운 리스트 "dist_list"를 생성합니다.
- 마지막으로 dist_list의 길이가 26인지 확인합니다. 조건이 참이면 입력 문자열은 판그램이고, 그렇지 않으면 판그램이 아닙니다.
예제 코드
# 판그램 여부를 확인하는 사용자 정의 함수
def check_pangram(input_str):
# 입력 문자열을 대문자로 변환
str_input = input_str.upper()
# 입력 문자열을 Set()으로 변환하면
# 중복이 제거된 고유 요소들의 집합이 생성됨
str_input = set(str_input)
# 숫자와 특수 문자를 걸러내고 알파벳만 추출
# ord(ch)는 해당 문자의 아스키(ASCII) 코드 값을 반환
dist_list = [char for char in str_input if ord(char) in range(ord('A'), ord('Z') + 1)]
if len(dist_list) == 26:
return 'String is a Pangram'
else:
return 'String is not a Pangram'
# 실행 가능한 메인 함수
if __name__ == "__main__":
str_input = input()
print(check_pangram(str_input))마무리
이번 글에서는 파이썬 3.x 이상 버전에서 문자열이 판그램인지 판별하는 방법을 알아보았습니다. 핵심은 set()을 통해 중복을 제거하고, 리스트 컴프리헨션으로 알파벳만 필터링한 뒤 그 개수가 26개인지 확인하는 것입니다. 이 알고리즘은 언어에 종속적이지 않으므로, 동일한 로직을 응용하면 다른 프로그래밍 언어로도 손쉽게 판그램 검사 프로그램을 만들 수 있습니다.