그냥 하는 노트와 메모장

BOJ 2112 두 부분 문자열, BOJ 3244 두 부분 문자열2 본문

Solved problems

BOJ 2112 두 부분 문자열, BOJ 3244 두 부분 문자열2

coloredrabbit 2020. 5. 20. 14:28

* BOJ 2112 두 부분 문자열, BOJ 3244 두 부분 문자열2

[분류 : 다이나믹 프로그래밍]


1. B문자열에 대한 모든 가능한 문자 26개에 대해 위치를 오름차순으로 저장하자.

  어떤 문자가 특정 위치 b를 포함한 이후에 존재하는지 안하는지 판단하기 위함이다.


2. 다이나믹 상태

  최대 공통 부분 수열(LCS)을 찾는 것처럼 생각해보자.

  현재 A의 위치 a, 현재 B의 위치 b로 상태 (a, b)에서 문제에서 요구하는 문자열의 길이를 찾아보자.


  1. A[a] 문자를 정답 문자열에 사용하지 않는다.

    이 때는 a위치를 한 칸 이동한다. b는 움직이지 않는다. 여기서 b를 움직여버리면 구조상 B 부분 문자열을 모두 확인할 수 없게 된다.

  2. A[a] 문자를 정답 문자열에 사용한다.

    2-1. A[a]에 해당하는 문자가 B문자열 내에 위치 b를 포함한 이후에 존재한다.

      이 경우엔 A[a] == B[x]인 가장 작은 x를 찾는다. 단, b <= x이다. x가 존재한다는 의미이므로 그 다음 부분 문제를 호출할 때는 길이 하나 증가하여 값을 비교해준다.

    2-2. A[a]에 해당하는 문자가 B문자열 내에 위치 b를 포함한 이후에 존재하지 않는다.

      이 경우엔 A[a]가 B문자열로 구성할 수 없는 부분 문자열의 마지막 문자임을 나타낸다. 이 과정이 가능한 이유는 2-1.에서 b를 움직이지 않기 때문이다.

  

  2.과정에서 인덱스 x의 존재여부는 단순 이분탐색으로 확인할 수 있다.


※ 소스는 3244번 문제가 2112 문제의 확장이기 때문에 3244번 소스만 올립니다.


'Solved problems' 카테고리의 다른 글

BOJ 15807 *빛*영*우*  (0) 2020.05.21
BOJ 3948 홍준이의 친위대  (0) 2020.05.20
BOJ 5580 빙고 게임  (0) 2020.05.20
BOJ 3026 V  (0) 2020.05.18
BOJ 10564 - 팔굽혀펴기  (0) 2020.04.22
Comments