만두맨두
만두 개발자 되다.
만두맨두
전체 방문자
오늘
어제
  • 분류 전체보기 (27)
    • 면접준비 (2)
    • GitHub (1)
    • JavaScript (5)
    • TypeScript (6)
    • REACT (1)
    • 에러 해결일지 (2)
    • 알고리즘 (7)
      • 이론 (4)
      • 자료구조 (1)
      • 프로그래머스 (2)
    • 만두의 일기 (1)
    • 프로젝트 (2)
      • 팀블로그 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 우선순위큐
  • 타입 챌린지
  • telling me
  • frontend
  • 타입챌린지
  • 다이나믹 프로그래밍
  • TypeScript
  • 배열의 길이
  • node.js
  • Beakjoon
  • 대괄호 표기법
  • 자바스크립트
  • dp
  • 호이스팅
  • dynamic programming
  • 점 표기법
  • 00018-easy-tuple-length
  • hoisting
  • TellingUs
  • Algorithm
  • 네임스페이스
  • PriorityQueue
  • programmers
  • eslint
  • JS
  • type-challenges
  • react
  • length
  • 프로그래머스
  • JavaScript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
만두맨두
알고리즘/이론

최장 공통 부분 수열 (LCS problme)

알고리즘/이론

최장 공통 부분 수열 (LCS problme)

2022. 12. 20. 20:33

Long Common Subsequence

한 개 이상의 문자열이 주어질 때,

중간에 다른 문자가 들어가더라도

공통되면서 가장 긴 부분 문자열을 찾는 문제

 

다이나믹 프로그래밍(DP, Dynamic Programming)을 사용해야 한다.

 

EX ) A와 B 두 개의 문자열이 주어진다.

         => A = 'ACAYKP' / B = 'CAPCAK'

 

1 ) ( 문자열의 길이 + 1 ) 만큼 2차원 배열을 생성한다.

      단, 인덱스가 0인 부분은 0으로 채워넣는다.

  - A C A Y K P
- 0 0 0 0 0 0 0
C 0            
A 0            
P 0            
C 0            
A 0            
K 0            

 

2) 한 글자씩 비교한다.

  - A C A Y K P
- 0 0 0 0 0 0 0
C 0 0          
A 0            
P 0            
C 0            
A 0            
K 0            

   - 글자가 같지 않다면, 위의 값과 왼쪽 값 중 큰 값을 삽입한다.

      = 글자가 같지 않다는 것은 전에 찾은 공통 수열 부분을 그대로 가져간다는 것을 의미한다.

         전에 찾은 공통 수열 부분은 위의 값과 왼쪽 값뿐이며, 최장 공통 부분이기 때문에 큰 값을 가져오면 된다.

  - A C A Y K P
- 0 0 0 0 0 0 0
C 0 0 1        
A 0            
P 0            
C 0            
A 0            
K 0            

   - 글자가 같다면, 왼쪽 위 대각선에 1을 더한 값을 삽입한다.

      = 왼쪽 위 대각선(A)과 현재 위치의 문자열(AC/C)을 비교할 때의 달라진 점은

         두 문자열 모두 현재 위치의 문자(C)가 추가되었다는 점이다.

         때문에 왼쪽 위 대각선에 1을 더한 값을 가져오면 된다.

 

❗점화식 ❗

( A[i] === B[j] ) graph[i][j] = graph[i - 1][j - 1] + 1

( A[i] !== B[j] ) graph[i][j] = Math.max( graph[i][j - 1], graph[i - 1][j] )

 

3) 최종 배열은 다음과 같다.

  - A C A Y K P
- 0 0 0 0 0 0 0
 C 0 0 1 1 1 1 1
A 0 1 1 2 2 2 2
P 0 1 1 2 2 2 3
C 0 1 2 2 2 2 3
A 0 1 2 3 3 3 3
K 0 1 2 3 3 4 4

 

자바스크립트 코드

const fs = require('fs');
const filePath = process.platform==='linux' ? '/dev/stdin':'input.txt';
const [a, b] = fs.readFileSync(filePath).toString().split('\n').map((v) => v.trim());

const [n, m] = [a.length, b.length];
let graph = Array.from(Array(n + 1), () => Array(m + 1).fill(0));

for (let i = 1; i <= n; i++) {
  for (let j = 1; j <= m; j++) {
    if (a[i - 1] === b[j - 1]) {
      graph[i][j] = graph[i - 1][j - 1] + 1;
    } else {
      graph[i][j] = Math.max(graph[i][j - 1], graph[i - 1][j]);
    }
  }
}

console.log(graph[n][m]);

 

 

 

 

'알고리즘 > 이론' 카테고리의 다른 글

유클리드 호제법 (Euclidean algorithm)  (0) 2023.02.19
가장 긴 증가하는 부분 수열 (LIS problem)  (0) 2023.01.19
배낭 문제 (Knapsack Problem)  (0) 2022.11.25
    '알고리즘/이론' 카테고리의 다른 글
    • 유클리드 호제법 (Euclidean algorithm)
    • 가장 긴 증가하는 부분 수열 (LIS problem)
    • 배낭 문제 (Knapsack Problem)
    만두맨두
    만두맨두
    프론트엔드 개발자가 되고 싶다 !

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.