이 튜토리얼에서는 문자열에 포함된 모든 중복 문자를 찾는 방법을 배워보겠습니다. 파이썬에서는 다양한 방식으로 이 문제를 해결할 수 있으며, 여기서는 대표적인 두 가지 방법을 하나씩 살펴보겠습니다.
프로그램의 목표는 문자열 안에서 두 번 이상 등장하는 문자를 찾아내는 것입니다. 예를 들어 문자열이 tutorialspoint라면, 프로그램은 t o i를 출력해야 합니다. 즉, 등장 횟수가 1보다 큰 문자들을 모두 찾으면 됩니다.
방법 1: count() 메서드 활용하기
외부 모듈 없이 파이썬 기본 기능만 사용하는 첫 번째 방법입니다. 문자열의 count() 메서드를 이용해 각 문자의 등장 횟수를 확인합니다. 진행 순서는 다음과 같습니다.
- 문자열을 초기화합니다.
- 중복 문자를 담을 빈 리스트를 생성합니다.
- 문자열을 순회하면서 각 문자의 빈도를
count()로 확인합니다. - 빈도가 1보다 크고 아직 리스트에 없다면 추가합니다.
- 결과를 출력합니다.
예제 코드
## 문자열 초기화
string = "tutorialspoint"
## 중복 문자를 저장할 리스트 초기화
duplicates = []
for char in string:
## str.count(char)는 해당 문자의 등장 횟수를 반환
if string.count(char) > 1:
## 리스트에 없는 경우에만 추가
if char not in duplicates:
duplicates.append(char)
print(*duplicates)실행 결과
t o i
위 코드를 실행하면 중복된 문자인 t, o, i가 공백으로 구분되어 출력됩니다. 다만 이 방법은 문자마다 전체 문자열을 다시 탐색하므로 시간 복잡도가 O(n²)이라는 점을 참고하세요.
방법 2: 딕셔너리 활용하기
두 번째 방법은 내장 메서드 없이 딕셔너리 자료구조를 이용하는 것입니다. 각 문자의 등장 횟수를 직접 세는 방식으로, 더 효율적입니다. 진행 순서는 다음과 같습니다.
- 문자열을 초기화합니다.
- 문자 빈도를 저장할 빈 딕셔너리를 생성합니다.
- 문자열을 순회하며 해당 문자가 딕셔너리에 있는지 확인합니다.
- 이미 있다면 카운트를 1 증가시키고, 없다면 1로 초기화합니다.
- 마지막으로 값이 1보다 큰 키만 출력합니다.
예제 코드
## 문자열 초기화
string = "tutorialspoint"
## 딕셔너리 초기화
duplicates = {}
for char in string:
## 이미 딕셔너리에 있는 경우 카운트 증가
if char in duplicates:
duplicates[char] += 1
else:
## 없는 경우 카운트를 1로 초기화
duplicates[char] = 1
for key, value in duplicates.items():
if value > 1:
print(key, end = " ")
print()실행 결과
t o i
딕셔너리 방식은 문자열을 한 번만 순회하면 되므로 시간 복잡도가 O(n)으로, 긴 문자열을 다룰 때 count() 방식보다 훨씬 효율적입니다. 참고로 파이썬의 collections.Counter를 사용하면 같은 로직을 더 간결하게 구현할 수도 있습니다.