문자열 s가 주어졌을 때, 해당 문자열이 아이소그램(Isogram)인지 판별하는 문제를 살펴보겠습니다. 아이소그램이란 모든 문자가 정확히 한 번씩만 등장하는 문자열을 의미합니다.
예를 들어 입력이 s = "education"이라면 출력은 True가 됩니다. "education"의 모든 문자(e, d, u, c, a, t, i, o, n)가 각각 한 번씩만 나타나기 때문입니다.
해결 접근 방식
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- 빈 리스트 char_list를 생성합니다.
- 문자열의 각 문자를 순회하면서 다음을 확인합니다.
- 문자가 알파벳인 경우:
- - 이미 char_list에 존재하면 False를 반환합니다.
- - 존재하지 않으면 char_list의 끝에 추가합니다.
- 모든 문자를 검사한 후 문제가 없으면 True를 반환합니다.
여기서 핵심 아이디어는 이미 등장한 문자를 리스트에 기록해 두고, 새로운 문자가 이전에 나타났는지 매번 확인하는 것입니다. 만약 중복된 문자를 발견하면 즉시 False를 반환하여 불필요한 연산을 줄일 수 있습니다.
구현 예제
다음 코드를 통해 더 잘 이해할 수 있습니다.
def solve(word):
char_list = []
for char in word:
if char.isalpha():
if char in char_list:
return False
char_list.append(char)
return True
s = "education"
print(solve(s))입력
"education"
출력
True
추가 팁: 더 효율적인 방법
위 방법은 리스트에서 `in` 연산자를 사용하기 때문에 시간 복잡도가 O(n²)입니다. 파이썬의 set 자료구조를 활용하면 O(n)으로 개선할 수 있습니다.
def solve(word):
return len(set(word.lower())) == len([c for c in word.lower() if c.isalpha()])set은 중복을 허용하지 않으므로, 문자열을 set으로 변환한 길이와 원래 알파벳 문자 수가 같다면 그 문자열은 아이소그램입니다. 대소문자 구분 없이 비교하려면 lower() 메서드를 사용하는 것이 좋습니다.