반응형
rolypolytoy
현's story
rolypolytoy
전체 방문자
오늘
어제
  • 분류 전체보기
    • 현's tory
    • Vision AI | 3D Graphics
    • 프로그래밍 언어
    • Computer Science
    • 알고리즘
      • 백준
    • 유용한 링크

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준다이나믹
  • 알고리즘구현
  • 다이나믹프로그래밍
  • 백준2533
  • 사회망서비스
  • EffectiveC++
  • 알고리즘
  • 백준이분탐색
  • 아키텍처패턴
  • 디자인패턴
  • 백준13397
  • 백준17471
  • PlantUML
  • 백준1756
  • 백준사회망서비스
  • vscodeopengl
  • IOS
  • 상표특허출원
  • iOSMetal
  • sync
  • 백준2302
  • c++
  • 백준알고리즘
  • 백준2169
  • 백준문제풀이
  • openglvscode
  • DFS조합
  • iOS비동기
  • 프로그래머스실패율
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
rolypolytoy
알고리즘/백준

[백준 9251] LCS C++

[백준 9251] LCS C++
알고리즘/백준

[백준 9251] LCS C++

2021. 1. 21. 20:38
반응형

www.acmicpc.net/problem/9251

 

9251번: LCS

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

www.acmicpc.net

최대공통부분 수열의 문제입니다.

 

처음에 용어가 헷갈렸는데,

LCS는 2가지의 용어가 있습니다.

1. LCS (Longest Common Substring) 최대공통부분문자열

2. LCS (Longest Common Subseqeunce) 최대공통부분수열

입니다.

 

둘의 큰 차이는 연속하냐 안하냐의 차이인데, 문자열의 경우 연속하는 문자열중 최대의 공통 부분 문자열이고,

수열은, 연속하지 않지만, 최대의 공통 부분의 문자를 찾는 것이 핵심입니다.

 

두 개의 문자열을 이 중 for문으로 하나씩 접근하면서,

문자 a[i-1], 문자 b[j-1] 가 같을 때 dp[i][j] = dp[i-1][j-1] + 1을 하여

같은 문자 개수 1개를 추가합니다. 

 

두 개의 문자가 같지 않을 때 i,j인덱스의 왼쪽, 위쪽 중에 최댓값을 취하는 이유는,

두 문자를 각 각 포함하지 않은 DP의 값에서 1을 더해주어야 하기 때문입니다.

  A C A Y K P  
C 0 0 0 0 0 0 0
A 0 0 1 DP[i-1][j-1] 1 1 1 1
P 0 1 1 2 DP[i][j] 2 2 2
C 0 1 1 2 2 2 3
A 0 1 2 2 2 2 3
K 0 1 2 3 3 3 3
  0 1 2 3 3 4 정답4

 

dp[i][j]의 의미는 i, j 인덱스 이전 까지의 LCS를 뜻합니다.

그리고, 만약 a[i-1], b[i-1]문자가 같지 않다면, 

dp[i-1][j]나, dp[i][j-1]에서 가장 큰값을 dp[i][j] 값에 그대로 복사하며 되겠습니다.

즉, a[i-1] 이나 b[i-1] 까지 공통 부분 문자 수열의 최대 값을 복사하시면 됩니다. 

 

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

const int MAX = 1001;

int dp[MAX][MAX];


void solution(){

    string a, b;
    cin >> a >> b;

    int a_size = a.length();
    int b_size = b.length();

    for (int i = 1; i <= a_size; i++)
        for (int j = 1; j <= b_size; j++){
            if (a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
            else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
        }

    cout << dp[a_size][b_size] << '\n';
    


}
int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    solution();

    return 0;
}

반응형
저작자표시 비영리 변경금지 (새창열림)

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

[백준 2169] 로봇 조종하기 C++  (0) 2021.01.22
[백준 9252] LCS 2 C++  (0) 2021.01.21
[백준 2096] 내려가기 C++  (0) 2021.01.21
[백준 1707] 이분 그래프 C++  (0) 2021.01.11
[백준 11660] 구간 합 구하기 5 C++  (0) 2021.01.10
    '알고리즘/백준' 카테고리의 다른 글
    • [백준 2169] 로봇 조종하기 C++
    • [백준 9252] LCS 2 C++
    • [백준 2096] 내려가기 C++
    • [백준 1707] 이분 그래프 C++
    rolypolytoy
    rolypolytoy
    현's storyrolypolytoy 님의 블로그입니다.

    티스토리툴바

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인

    단축키

    내 블로그

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

    블로그 게시글

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

    모든 영역

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

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