Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 주어진 문자열이 팬그램(Pangram)인지 확인하는 프로그램

팬그램(Pangram)은 영어 알파벳 26개 글자를 모두 최소 한 번 이상 사용한 문장을 의미합니다. 이번 글에서는 주어진 문자열 s가 하나의 문장을 나타낼 때, 영어 알파벳의 모든 글자가 최소 한 번씩 사용되었는지 판별하는 파이썬 프로그램을 작성해 보겠습니다.

예를 들어 입력 문자열이 "The grumpy wizards make toxic brew, for the evil queen and Jack"이라면, 알파벳 전체가 포함되어 있으므로 출력 결과는 True가 됩니다.

문제 해결 접근 방법

  • 먼저 문자열 s의 모든 글자를 소문자로 변환합니다.
  • 영어 알파벳 a부터 z까지 순서대로 순회하며 다음을 검사합니다.
    • 현재 알파벳이 문자열 s에 존재하지 않으면 False를 반환합니다.
  • 모든 알파벳이 존재한다면 True를 반환합니다.

구현 예제

아래 코드를 통해 더 자세히 이해해 보겠습니다.

import string
class Solution:
    def solve(self, s):
        s = s.lower()
        for i in string.ascii_lowercase:
            if i not in s:
                return False
        return True

s = "The grumpy wizards make toxic brew, for the evil queen and Jack"
ob = Solution()
print(ob.solve(s))

입력

"The grumpy wizards make toxic brew, for the evil queen and Jack"

출력

True

코드 설명

string.ascii_lowercase는 'abcdefghijklmnopqrstuvwxyz'라는 소문자 알파벳 전체를 담고 있는 상수입니다. s.lower()로 문자열을 모두 소문자로 변환한 뒤 대소문자 구분 없이 비교할 수 있도록 합니다. 이후 각 알파벳이 문자열에 포함되어 있는지 확인하고, 하나라도 빠져 있다면 즉시 False를 반환하여 불필요한 연산을 줄입니다.

더 간결한 대안: set() 활용하기

집합(set) 자료형을 사용하면 코드를 훨씬 간결하게 만들 수 있습니다. 문자열을 집합으로 변환한 뒤 알파벳 집합과의 포함 관계만 확인하면 됩니다.

import string

def is_pangram(s):
    return set(string.ascii_lowercase) <= set(s.lower())

s = "The grumpy wizards make toxic brew, for the evil queen and Jack"
print(is_pangram(s))  # True

이 방식은 내부적으로 C 수준에서 동작하기 때문에 일반적인 반복문보다 빠르며, 가독성도 뛰어나 실무에서 널리 사용됩니다.

시간 복잡도 분석

첫 번째 방법은 알파벳 26개에 대해 각각 in 연산을 수행하므로 시간 복잡도는 O(26 × n), 즉 O(n)입니다. 두 번째 set 기반 방법 역시 O(n)의 시간 복잡도를 가지지만, 실제 실행 속도 면에서 유리합니다.