[백준1958] LCS 3

2021. 5. 3. 17:13·알고리즘 문제풀이

 

www.acmicpc.net/problem/9251

 

9251번: LCS

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

www.acmicpc.net

개념

LCS는Longest Common Subsequence의 줄임말로,공통 부분 문자열 중 가장 길이가 긴 문자열을 말합니다.

이 때, Substring과 Subsequence와의 차이점을 알 필요가 있습니다.

 

  • Substring : 전체 문자열에서연속된부분 문자열
  • Subsequence : 전체 문자열에서꼭 연속된 문자열인 것은 아닌부분 문자열

서로 다른 문자열 중에서 공통 Subsequence를 찾는데,그 중길이가 가장 긴 Subsequence를 찾으려 하는 것입니다.

[예] ABCDEF 와 ACDGHI 와의공통 Subsequence 중 가장 길이가 긴 것은 ABCDEF /AZGCDGHI 에서ACD이다.


풀이

문자열 2개를 통한 LCS 알고리즘을 알아야 풀 수 있습니다.

문자열RBKBGRBG과, 문자열BGKRBRKB가 있다고 해 봅시다.

이런식으로 2차원 dp배열을 짜고 dp[i][j]에 가장 긴 LCS를 넣어줍니다.

차례대로 진행을 해나가다 보면 규칙성을 발견할 수 있습니다.

 

  • 문자열을 비교하여 같았을 때 현재 칸에 들어갈 값은대각선 왼쪽 위의 값 + 1이다
  • 문자열을 비교하여 달랐을 때 현재 칸에 들어갈 값은왼쪽과 위쪽의 값 중 더 큰 값이 들어간다.

기존에 풀이법을 알고 있지 않으면 DP는 이런식으로 규칙성을 찾아서 점화식을 만드는게 중요합니다

점화식은 위의 규칙을 활용하면

문자가 일치할 때

 

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

문자가 일치하지 않을 때

 

  • dp[i][j] = max(dp[i-1][j],dp[i][j-1])

이라고 볼 수 있습니다.

LCS 3는 문자열을 3개로 늘렸을 뿐 규칙은 똑같습니다. 즉 아래와 같이 점화식이 만들어집니다.

문자가 일치할 때

 

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

문자가 일치하지 않을 때

 

  • dp[i][j][k] = max(dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1])

코드

s1 = input()
s2 = input()
s3 = input()

dp = [[[0 for i in range(101)] for j in range(101)] for k in range(101)]
n1,n2,n3 = len(s1),len(s2),len(s3)

for i in range(1,n1+1):
    for j in range(1,n2+1):
        for k in range(1,n3+1):
            if s1[i-1] == s2[j-1] == s3[k-1]:
                dp[i][j][k] = dp[i-1][j-1][k-1] +1
            else:
                dp[i][j][k] = max(dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1])
    
print(dp[n1][n2][n3])

'알고리즘 문제풀이' 카테고리의 다른 글

[프로그래머스lv3] [2020 카카오 인턴십] 보석 쇼핑  (0) 2021.05.04
[프로그래머스lv.3] 순위  (0) 2021.05.04
[프로그래머스.lv3] 입국심사  (0) 2021.05.03
[백준2262] 토너먼트 만들기  (0) 2021.05.03
[백준1114] 통나무 자르기  (0) 2021.05.03
'알고리즘 문제풀이' 카테고리의 다른 글
  • [프로그래머스lv.3] 순위
  • [프로그래머스.lv3] 입국심사
  • [백준2262] 토너먼트 만들기
  • [백준1114] 통나무 자르기
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • Server (3)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준1747
    소수&팰린드롬
    카카오 1차
    백준 1027
    소가 길을 건너간 이유 5
    백준 17281
    백준 램프
    프로그래머스 보석 쇼핑
    자바 물리 메모리
    백준 어린 왕자
    컴공 취준
    백준14465
    선발 명단
    자바 최소공배수
    네카라쿠배 취업
    백준 18405
    백준2262
    백준 파티
    카카오 필요스펙
    백준 1004
    보석 쇼핑
    경력 서류
    백준 1114
    파이썬
    백준 10610
    백준 고층 건물
    프로그래머스 정수 삼각형
    백준 인형들
    백준1188
    자바 최대공약수
    1114백준
    백준 1114 파이썬
    백준 30
    토너먼트 만들기
    다이렉트 버퍼
    백준 5347
    합승 택시 요금
    자바 스레드 상태
    백준15954
    백준1238
    백준6980
    통나무 자르기
    카카오 인턴
    2020 카카오 인턴
    ai개발자
    백준 경쟁적 전염
    백준 1034
    direct buffer
    커널 스레드 상태
    네이티브 메모리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[백준1958] LCS 3
상단으로

티스토리툴바