ANA가 두 곳에 겹치는데, 왜 하나만 찾았을까요?

BANANA의 글자칸에 작은 창을 겹쳐 놓고 ANA의 시작 번호를 찾습니다. 겹치지 않는 일치를 꺼내는 검색과 모든 시작 위치를 기록하는 검색을 구분하고, 필요한 결과에 맞는 방법을 골라요.

무지 나무 블록과 종이 위 겹친 투명 직사각 창

이미지: AI 생성 · 수학 이야기

BANANA에서 ANA를 찾으면 두 번인데, 검색은 왜 한 번만 돌려줄까요? 글자 여섯 개를 따로 적고, 두 개의 작은 창으로 어디서부터 일치하는지 표시해 볼까요?

이번에는 대문자를 그대로 구별하고 글자를 바꾸지 않아요. 왼쪽부터 B·A·N·A·N·A에 1~6번을 붙여요. 세 글자 창이 들어갈 시작 번호는 6−3+1=4개, 즉 1·2·3·4입니다. 순서대로 읽으면 BAN·ANA·NAN·ANA이므로, ANA의 시작 번호 집합 M은 {2,4}입니다.

n(M)은 시작 번호의 개수예요. P₂와 P₄는 각 일치가 차지하는 글자 번호의 집합으로 쓸게요.

M={2,4},n(M)=2,P2={2,3,4},P4={4,5,6},P2∩P4={4}.\begin{aligned}M&=\{2,4\},&n(M)&=2,\\P_2&=\{2,3,4\},&P_4&=\{4,5,6\},\\P_2\cap P_4&=\{4\}.\end{aligned}

두 창은 4번 A를 함께 써요. 따라서 ‘모든 시작 위치를 표시하기’에는 두 점이 필요하지만, ‘겹치지 않는 일치만 왼쪽부터 뽑기’에는 두 창을 모두 넣을 수 없어요.

Python의 re.findall("ANA", "BANANA")는 두 번째 규칙이에요. 먼저 2~4번을 쓰고 나면 다음 검색은 5번 이후에서 시작해요. 거기에는 세 글자가 남지 않아 결과가 한 번이에요. 글자가 사라진 것이 아니라 셈의 조건이 달랐어요.

모든 시작점을 기록하려면 글자를 소비하지 않는 전방 탐색 (?=ANA)를 쓸 수 있어요. re.finditer의 각 결과에서 m.start()+1을 기록하면 종이 번호 2·4를 얻어요. 보통 문자 검색으로 돌아가면 한 번이에요. 작은 창을 겹쳐 놓을 것인지부터 정하고, 목적에 맞는 검색을 골라 볼까요?

착안: Python 공식 re 문서의 비중첩 검색과 전방 탐색 정의. 고정 단어와 글자칸 활동은 자체 사례이며, 알려진 기능·집합 계산을 새 정리로 주장하지 않아요.

이 글 공유하기

개인정보 및 방문 통계 안내