Ch.2 배열과 문자열
문자열 조작 — Reverse, Palindrome, Anagram
문자열의 배열적 특성을 이해하고 in-place 조작 기법을 익힌다Palindrome과 Anagram 판별을 효율적으로 구현한다
문자열은 결국 문자의 배열이다
"racecar"를 뒤집어도 "racecar"입니다. "listen"의 글자를 재배열하면 "silent"가 되죠.
문자열 문제는 배열 문제와 무엇이 다를까?
문자열 = 문자 배열입니다. 배열 기법(Two Pointer, 해시)을 그대로 적용할 수 있습니다!
lightbulb
핵심 개념
Palindrome
앞뒤로 읽어도 같은 문자열 (예: racecar)
Anagram
글자 구성이 같은 두 문자열 (예: listen ↔ silent)
article
핵심 내용
프로그래밍에서 문자열은 문자(char)의 배열입니다
Two Pointer로 문자열을 제자리에서 뒤집어봅시다. 추가 메모리 없이 O(n)!
def reverse_string(s: list[str]) -> None:
"""in-place 뒤집기 — 추가 메모리 O(1)"""
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
# 테스트
chars = ['h', 'e', 'l', 'l', 'o']
reverse_string(chars)
print(chars) # ['o', 'l', 'l', 'e', 'h']Palindrome 판별도 Two Pointer! 양 끝에서 좁혀오며 비교합니다
def is_palindrome(s: str) -> bool:
"""영문·숫자만 비교, 대소문자 무시"""
s = ''.join(c.lower() for c in s if c.isalnum())
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
print(is_palindrome("A man, a plan, a canal: Panama")) # True
print(is_palindrome("race a car")) # FalseAnagram = 글자 구성(빈도)이 같은 두 문자열 Counter(해시맵)로 O(n) 판별!
from collections import Counter
def is_anagram(s: str, t: str) -> bool:
return Counter(s) == Counter(t)
print(is_anagram("listen", "silent")) # True
print(is_anagram("hello", "world")) # False
# Counter 없이 직접 구현
def is_anagram_manual(s: str, t: str) -> bool:
if len(s) != len(t):
return False
count = {}
for c in s:
count[c] = count.get(c, 0) + 1
for c in t:
count[c] = count.get(c, 0) - 1
if count[c] < 0:
return False
return TruePalindrome 판별의 시간복잡도는?
"listen"과 "silent"는 Anagram이다
Anagram 판별에 가장 효율적인 자료구조는 ____(해시맵)이다.
Anagram 판별에 가장 효율적인 자료구조는 ____(해시맵)이다.
문자열 조작 마스터
key
핵심 용어
🔄
Reverse
문자열을 뒤집기 (Two Pointer 활용)
🪞
Palindrome
앞뒤로 읽어도 같은 문자열
🔀
Anagram
글자 구성(빈도)이 동일한 문자열 쌍
edit_note
정리 노트
문자열 = 문자 배열
3대 문자열 기법
- Reverse
- Two Pointer로 in-place 뒤집기 — O(n), O(1) 공간
- Palindrome
- 양 끝 비교 Two Pointer — O(n)
- Anagram
- Counter(해시맵) 빈도 비교 — O(n)
★
면접 포인트: 문자열 문제에서 '이건 결국 배열 문제입니다'라고 말할 수 있어야 합니다!
image
시각 자료
다이어그램: ds-d13
다이어그램: ds-d14
check_circle
핵심 정리
- 1문자열 = 문자 배열, 배열 기법 그대로 적용
- 2Reverse: Two Pointer in-place O(n)
- 3Palindrome: 양 끝 비교 O(n)
- 4Anagram: Counter 해시맵 O(n)
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작