문자열 탐색, 패턴 매칭, 아나그램, 회문, 투 포인터 등 문자열을 다루는 다양한 알고리즘을 정리했습니다.
1. 문자열 탐색
문자열에서 특정 문자나 패턴을 찾는 기본적인 방법입니다.
파이썬에서는 find(), in 연산자, index() 등을 활용할 수 있습니다.
실제 문제에서는 여러 번 등장하는 경우 모든 위치를 찾거나, 부분 문자열의 개수를 세는 등으로 확장할 수 있습니다.
s = "hello world"
print(s.find("world")) # 6 (찾으면 시작 인덱스, 없으면 -1)
print("wor" in s) # True (포함 여부)
# 여러 번 등장하는 모든 위치 찾기
target = "l"
positions = [i for i, c in enumerate(s) if (c == target)]
print(positions) # [2, 3, 9]
# 부분 문자열 개수 세기
print(s.count("l")) # 3
2. 패턴 매칭
문자열 내에서 특정 패턴(부분 문자열)이 어디에 등장하는지 효율적으로 찾는 알고리즘입니다.
단순히 find()로도 찾을 수 있지만, KMP, Rabin-Karp 등 고급 알고리즘은 긴 문자열과 패턴에서 빠른 탐색이 가능합니다.
실전 코딩테스트에서는 내장 함수로도 충분하지만, 알고리즘 원리를 이해해두면 좋습니다.
s = "ababcababc"
pattern = "abc"
print(s.find(pattern)) # 2
# 모든 패턴 등장 위치 찾기
positions = []
start = 0
while True:
idx = s.find(pattern, start)
if (idx == -1):
break
positions.append(idx)
start = idx + 1
print(positions) # [2, 7]
3. 아나그램(Anagram)
아나그램은 두 문자열이 문자 구성은 같지만 순서만 다른 경우를 의미합니다.
예를 들어 'listen'과 'silent'처럼, 각 문자의 개수가 모두 같으면 아나그램입니다.
문자열을 정렬하거나, 딕셔너리/Counter로 문자 개수를 비교하는 방식이 자주 쓰입니다.
a = "listen"
b = "silent"
print(sorted(a) == sorted(b)) # True
4. 회문(Palindrome)
회문은 앞에서부터 읽으나 뒤에서부터 읽으나 같은 문자열을 의미합니다.
예를 들어 'level', 'racecar' 등이 있습니다.
문자열을 뒤집어서 비교하거나, 투 포인터로 양쪽에서 비교하는 방식이 있습니다.
회문 판별은 문자열 문제에서 자주 등장하는 기본 패턴입니다.
s = "level"
print(s == s[::-1]) # True
# 대소문자 구분 없이 회문 판별
word = "RaceCar"
print(word.lower() == word.lower()[::-1]) # True
5. 투 포인터(Two Pointer)
투 포인터는 리스트나 문자열에서 두 개의 인덱스를 사용해 효율적으로 문제를 푸는 기법입니다.
정렬된 배열에서 합이 특정 값이 되는 쌍 찾기, 회문 판별, 구간 합 등 다양한 문제에 활용됩니다.
양쪽 끝에서 시작해 가운데로 이동하거나, 한쪽 포인터는 고정하고 다른 한쪽만 이동시키는 등 다양한 변형이 있습니다.
s = "abccba"
left, right = 0, len(s) - 1
is_palindrome = True
while (left < right):
if (s[left] != s[right]):
is_palindrome = False
break
left += 1
right -= 1
print(is_palindrome) # True
# 투 포인터로 부분합 구하기 예시
arr = [1, 2, 3, 2, 5]
sum_target = 5
left = right = total = 0
count = 0
n = len(arr)
while True:
if (total >= sum_target):
total -= arr[left]
left += 1
elif (right == n):
break
else:
total += arr[right]
right += 1
if (total == sum_target):
count += 1
print(count) # 3 ([2,3], [3,2], [5])'GDGoC > Python' 카테고리의 다른 글
| [Python] Algorithm #03: 이분 탐색 (Binary Search) (0) | 2026.05.06 |
|---|---|
| [Python] Basic #03: 정렬 (1) | 2026.05.06 |
| [Python] Basic #02: 리스트와 문자열 활용 (0) | 2026.04.25 |
| [Python] Algorithm #01: 자료구조 (0) | 2026.04.25 |
| [Python] Basic #01: 입출력 고급 (1) | 2026.04.25 |