[백준 9251][파이썬] LCS (최장 공통 부분 수열)

2023. 3. 18. 12:00·백준 알고리즘/dp
728x90

https://www.acmicpc.net/problem/9251

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

dp[x][y]를 다음과 같이 정의한다.

 

dp[x][y]는 첫 번째로 입력받은 문자열을 s1이라 하고 두 번째로 입력받은 문자열을 s2라고 한다면

 

s1에서 x번째 문자까지와 s2에서 y번째 문자까지를 비교했을 때 최장 공통 부분 수열의 길이이다.

 

예를 들어 dp[2][4]라고 한다면 "AC"와 "CAPC"의 최장 공통 부분 수열의 길이인 "AC"즉, 2이다.

 

이를 활용하여 dp를 적용하면 된다.

 

dp[x][y]를 구할 때는 우선 s1의 x번째 문자를 s2의 모든 문자와 비교한다.

 

만약 같은 문자가 나온다면 dp[x][y]는 dp[x-1][y-1] + 1이 된다.

 

나오지 않는다면 dp[x-1][y]와 dp[x][y-1]중 큰 값이 dp[x][y]의 값이 된다.

 

여기서 중요한 점은 dp[x][y]에서 x나 y, 둘 중 하나라도 0이 존재하면 그 값은 0으로 만들고 1부터 시작해야한다.

 

0부터 시작하면 dp[x-1][y-1] 값을 구할 때 인덱스가 음수가 되어 에러가 발생하기 때문이다.

 

<전체 코드>

import sys
input=sys.stdin.readline

#인덱스 맞추기 위해 앞에 의미없는 문자 추가. 
s1 = [0]+list(input().rstrip())
s2 = [0]+list(input().rstrip())

#dp[x][y] 
#첫 번째 문자열 x번째까지와 두 번째 문자열 y번째까지 비교했을 때 LCS 길이

dp=[[0]*len(s2) for _ in range(len(s1))]
for i in range(1, len(s1)):
    for j in range(1, len(s2)):
        if s1[i]==s2[j]:
            dp[i][j]=dp[i-1][j-1]+1
        else:
            dp[i][j]=max(dp[i][j-1], dp[i-1][j])
print(dp[len(s1)-1][len(s2)-1])

 

 

728x90

'백준 알고리즘 > dp' 카테고리의 다른 글

[백준 1520][Java] 내리막 길  (1) 2025.02.17
[백준 15486][JAVA] 퇴사 2  (1) 2025.02.15
[백준 11066][파이썬] 파일 합치기 (dp 알고리즘)  (0) 2023.03.15
[백준 2839][파이썬] 설탕 배달  (0) 2023.01.23
[백준 1699][파이썬] 제곱수의 합  (0) 2023.01.14
'백준 알고리즘/dp' 카테고리의 다른 글
  • [백준 1520][Java] 내리막 길
  • [백준 15486][JAVA] 퇴사 2
  • [백준 11066][파이썬] 파일 합치기 (dp 알고리즘)
  • [백준 2839][파이썬] 설탕 배달
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    푸쉬 알람
    Vector Store
    ci/cd
    codetree
    ChatPromptTemplate
    파이썬
    bfs
    nn.RNN
    스택
    code tree
    다익스트라
    openvidu 배포
    parametric search
    RNN
    Merge
    binary search
    스프링 OAuth2
    influxDB CLI
    embedding
    AWS Lambda
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[백준 9251][파이썬] LCS (최장 공통 부분 수열)
상단으로

티스토리툴바