Arian Soleimanzadeh
  • 홈
  • 블로그
  • 팟캐스트
  • 비디오
  • 문의
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
패널•빠른 문의

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

상담 예약

짧은 메시지를 남겨주세요 — 가능한 한 빠르게 답변드리겠습니다.

LinkedIn빠른 응답
홈/아티클/Regular Expression Matching이란? Dynamic Programming과 TypeScript로 Regex 이해하기
Algorithms아티클

Regular Expression Matching이란? Dynamic Programming과 TypeScript로 Regex 이해하기

문자열 전체를 .와 *가 포함된 Pattern과 매칭하는 고전적인 Dynamic Programming 문제입니다. 상태 정의, Star 처리, TypeScript 구현과 복잡도를 설명합니다.

2026년 8월 19일7 분 읽기0 조회수
#Algorithms#Regex#Regular Expression#Dynamic Programming#String Algorithms#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

dot과 star Pattern을 Dynamic Programming으로 매칭하는 Regex 알고리즘 시각화

Arian Soleimanzadeh

AI · 코드 · 제품

연구 + 엔지니어링
이 페이지에서
DotStarDynamic Programming일반 문자 또는 DotStarTypeScript복잡도MemoizationRegex와 Wildcard 차이Full Match실제 활용면접 핵심정리

고전적인 Regular Expression Matching 문제에서는 일반 문자와 다음 두 연산자를 가진 Pattern을 사용합니다.

.  → 임의의 한 문자
*  → 이전 요소를 0번 이상 반복

예:

s = "aa"
p = "a*"

결과는 true입니다.

Dot

.은 정확히 한 문자를 의미합니다.

c.t

는 cat, cut, c9t와 Match할 수 있습니다.

Star

*는 앞 요소에 적용됩니다.

a*

는 빈 문자열부터 여러 개의 a까지 표현할 수 있습니다.

Dynamic Programming

다음을 정의합니다.

dp[i][j]

첫 번째 i개의 String 문자와 첫 번째 j개의 Pattern 문자가 완전히 Match하는지를 의미합니다.

dp[0][0] = true

또한 a*b*c* 같은 Pattern은 모든 Star를 0번 사용할 수 있으므로 빈 String과도 Match합니다.

일반 문자 또는 Dot

현재 문자가 같거나 Pattern이 .이면:

dp[i][j] = dp[i - 1][j - 1]

Star

먼저 이전 요소와 *를 사용하지 않는 경우:

dp[i][j] = dp[i][j - 2]

이전 Pattern 요소가 현재 String 문자와 Match한다면 하나를 더 Consume할 수 있습니다.

dp[i][j] = dp[i][j] || dp[i - 1][j]

TypeScript

function isRegexMatch(s: string, p: string): boolean {
  const dp = Array.from(
    { length: s.length + 1 },
    () => new Array(p.length + 1).fill(false)
  );

  dp[0][0] = true;

  for (let j = 2; j <= p.length; j++) {
    if (p[j - 1] === '*') {
      dp[0][j] = dp[0][j - 2];
    }
  }

  for (let i = 1; i <= s.length; i++) {
    for (let j = 1; j <= p.length; j++) {
      if (
        p[j - 1] === '.' ||
        p[j - 1] === s[i - 1]
      ) {
        dp[i][j] = dp[i - 1][j - 1];
      } else if (p[j - 1] === '*') {
        dp[i][j] = dp[i][j - 2];

        if (
          p[j - 2] === '.' ||
          p[j - 2] === s[i - 1]
        ) {
          dp[i][j] =
            dp[i][j] || dp[i - 1][j];
        }
      }
    }
  }

  return dp[s.length][p.length];
}

복잡도

Time Complexity: O(n × m)
Space Complexity: O(n × m)

Memoization

Recursive하게도 해결할 수 있습니다.

x*를 만나면:

x*를 0번 사용

또는 현재 문자가 맞으면:

문자 하나를 Consume하고 x* 유지

두 Branch가 생깁니다.

Memoization이 없으면 같은 상태를 반복 계산할 수 있습니다.

Regex와 Wildcard 차이

Regex에서는:

* → 이전 요소 반복

Wildcard Matching에서는 보통:

* → 임의의 문자열

이므로 의미가 다릅니다.

Full Match

이 문제에서는 Pattern이 전체 String을 Match해야 합니다.

따라서 ell은 hello 전체와 Match하지 않습니다.

실제 활용

실제 Regex는 Validation, Search, Log Filtering, Text Processing 등에 사용됩니다.

애플리케이션에서는 직접 Regex Engine을 구현하기보다 언어에서 제공하는 검증된 Engine을 사용하는 것이 일반적입니다.

면접 핵심

  • . 의미
  • * 의미
  • DP State
  • Empty String 처리
  • 0회/여러 회 반복
  • O(n × m) 복잡도

정리

Regular Expression Matching은 재귀적 Branching 문제를 Dynamic Programming으로 바꾸는 대표적인 예제입니다.

이 페이지에서
DotStarDynamic Programming일반 문자 또는 DotStarTypeScript복잡도MemoizationRegex와 Wildcard 차이Full Match실제 활용면접 핵심정리

아티클 정보

게시 정보, 읽기 시간 및 조회 데이터입니다.

게시일

2026년 8월 19일

업데이트

2026년 8월 19일

읽기 시간

7 분 읽기

조회수

0

작성자

Arian Soleimanzadeh

이전 아티클

Rabin–Karp 알고리즘이란? Rolling Hash로 문자열 검색하기

다음 아티클

B2B CRM과 B2C CRM의 차이: 영업 프로세스부터 소프트웨어 아키텍처까지

깔끔하고 빠르며 아름다운 것을 함께 만들어 봅시다.

협업, 컨설팅, 제품 작업을 위한 빠른 문의입니다.

빠른 문의이메일 보내기
Arian Soleimanzadeh

현대적인 웹 엔지니어링, UI 시스템, 실용적인 AI 제품에 집중한 개인 포트폴리오 — 깨끗한 코드, 명확한 디자인.

빠른 링크

  • 소개
  • 블로그
  • 프로젝트
  • 문의

문의

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

가능 시간: 평일

보통 다음 시간 내에 답변합니다 24시간.

뉴스레터

글, 프로젝트, 새 릴리스에 대한 업데이트를 받아보세요.

© 2026 ariansoleimanzadeh.site — 모든 권리 보유.

LinkedIn