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빠른 응답
홈/아티클/Longest Common Substring이란? Dynamic Programming으로 가장 긴 공통 부분 문자열 찾기
Algorithms아티클

Longest Common Substring이란? Dynamic Programming으로 가장 긴 공통 부분 문자열 찾기

Longest Common Substring은 두 문자열에 연속해서 등장하는 가장 긴 공통 문자열을 찾는 문제입니다. DP 원리, TypeScript 구현, 복잡도와 LCS 차이를 설명합니다.

2026년 8월 19일7 분 읽기0 조회수
#Algorithms#Longest Common Substring#String Algorithms#Dynamic Programming#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

두 문자열의 가장 긴 연속 공통 부분을 표시하는 Longest Common Substring DP 테이블

Arian Soleimanzadeh

AI · 코드 · 제품

연구 + 엔지니어링
이 페이지에서
Substring의 핵심은 연속성Dynamic Programming예제 테이블TypeScript 구현복잡도Longest Common Substring과 LCS 차이실제 활용여러 정답기술 면접 핵심정리

Longest Common Substring 문제는 두 문자열에 공통으로 존재하는 가장 긴 연속된 문자열을 찾는 문제입니다.

예:

ABABC
BABCA

두 문자열에 연속해서 존재하는 가장 긴 부분은:

BABC

이므로 길이는 4입니다.

Substring의 핵심은 연속성

문자열:

ABCDE

에서 다음은 Substring입니다.

ABC
BCD
DE

하지만 ACE는 문자가 연속하지 않기 때문에 Substring이 아닙니다.

Dynamic Programming

다음을 정의합니다.

dp[i][j]

이는 a[i - 1]와 b[j - 1]에서 정확히 끝나는 공통 Substring의 길이입니다.

두 문자가 같으면:

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

다르면:

dp[i][j] = 0

Mismatch에서 0으로 초기화하는 이유는 Substring이 반드시 연속되어야 하기 때문입니다.

예제 테이블

      B  A  B  C  A
A     0  1  0  0  1
B     1  0  2  0  0
A     0  2  0  0  1
B     1  0  3  0  0
C     0  0  0  4  0

가장 큰 값은 4이며 BABC를 의미합니다.

TypeScript 구현

function longestCommonSubstring(
  a: string,
  b: string
): string {
  const dp = Array.from(
    { length: a.length + 1 },
    () => new Array(b.length + 1).fill(0)
  );

  let maxLength = 0;
  let endIndex = 0;

  for (let i = 1; i <= a.length; i++) {
    for (let j = 1; j <= b.length; j++) {
      if (a[i - 1] === b[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;

        if (dp[i][j] > maxLength) {
          maxLength = dp[i][j];
          endIndex = i;
        }
      }
    }
  }

  return a.slice(endIndex - maxLength, endIndex);
}

복잡도

문자열 길이를 각각 n, m이라고 하면:

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

이전 Row만 유지하면 공간을:

O(min(n, m))

까지 최적화할 수 있습니다.

Longest Common Substring과 LCS 차이

Substring은 문자가 연속해야 합니다.

Subsequence는 문자가 떨어져 있어도 순서만 유지되면 됩니다.

예:

ABCDEF
ACEF

ACEF는 Common Subsequence가 될 수 있지만 첫 문자열의 Substring은 아닙니다.

DP에서도 중요한 차이가 있습니다.

Longest Common Substring에서 mismatch가 발생하면:

dp[i][j] = 0

입니다.

실제 활용

이 개념은 다음과 같은 곳에서 활용할 수 있습니다.

  • 문자열 유사도 분석
  • CRM 데이터 중복 탐지
  • Data Cleaning
  • DNA Sequence 비교
  • 문서 및 버전 비교
  • Log Pattern 분석

실제 중복 탐지 시스템에서는 Levenshtein Distance, Email, Phone, Token Similarity 등 다른 Signal과 함께 사용하는 것이 좋습니다.

여러 정답

같은 최대 길이를 가진 Substring이 여러 개 존재할 수도 있습니다.

abcXYZ123
abcABC123

여기에서는 abc와 123 모두 길이 3입니다.

기술 면접 핵심

면접에서는 다음을 설명할 수 있어야 합니다.

  • Substring은 연속되어야 한다.
  • dp[i][j]가 무엇을 의미하는가.
  • mismatch에서 왜 0으로 초기화하는가.
  • maxLength를 따로 유지해야 하는 이유.
  • 시간 복잡도 O(n × m).

정리

Longest Common Substring의 핵심 관계는 다음과 같습니다.

Match    → dp[i - 1][j - 1] + 1
Mismatch → 0

즉, 하나라도 문자가 다르면 현재 연속 Match는 즉시 끊어집니다.

이 페이지에서
Substring의 핵심은 연속성Dynamic Programming예제 테이블TypeScript 구현복잡도Longest Common Substring과 LCS 차이실제 활용여러 정답기술 면접 핵심정리

아티클 정보

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

게시일

2026년 8월 19일

업데이트

2026년 8월 19일

읽기 시간

7 분 읽기

조회수

0

작성자

Arian Soleimanzadeh

다음 아티클

Palindrome이란? Two Pointers와 TypeScript로 팰린드롬 검사하기

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

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

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

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

빠른 링크

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

문의

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

가능 시간: 평일

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

뉴스레터

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

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

LinkedIn