[알고리즘 스터디 - 1주차 2] 바이러스 복제

난이도

Gold 5

문제

상근이는 DNA의 일부를 교체해 복제를 시작하는 바이러스를 발견했다.

이 바이러스는 어떤 DNA의 연속된 일부분을 다른 DNA로 교체한다.

이제, 다음 연구를 위해 바이러스에 의해 교체된 DNA의 길이를 구해보려고 한다.

바이러스에 감염되기 전 DNA와 감염된 후 DNA가 주어진다. 두 번째 DNA로 바뀌기 위해 첫 번째 DNA에 삽입되어야 하는 연속된 DNA 조각의 길이를 구하는 프로그램을 작성하시오.

연속된 DNA 조각은 삽입되기 전, 원래 그 자리에 있는 DNA를 제거할 수도 있다.

입력

첫째 줄에 바이러스에 감염되기 전 DNA, 둘째 줄에 감염된 후의 DNA가 주어진다.

DNA는 {A, G, C, T}로만 이루어져 있으며, 길이는 1보다 크거나 같고, 105보다 작거나 같다.

출력

첫째 줄에 바이러스에 의해 삽입된 DNA 길이의 최솟값을 출력한다.

예제 입력

AAAAA
AGCGAA

예제 출력

3

해설 및 후기

투-포인터와 유사한 방법으로 해당 문제를 풀이했다. 원래 DNA에서 삭제는 얼마나 해도 상관없다는 점에서 착안하여, 앞쪽에서부터 다른 DNA가 나올 때까지 증가시키고, 뒤쪽에서부터 다른 DNA가 나올 때까지 증가시켰다. 이후 n-lst > fst인 경우 n-fst-lst를 출력하고, 그렇지 않은 경우 예외를 처리하기 위해 삭제만 된 경우, 삽입만 된 경우를 분기하여 처리하였다.

제출 코드

a = list(input())
b = list(input())
rA = list(reversed(a))
rB = list(reversed(b))
n = len(b)
m = len(a)
fst = -1
lst = -1

i = 0
while(i < n):
    if(i >= m):
        break

    if(a[i] != b[i]):
        break
    i+=1
fst = i

i = 0
while(i<n):
    if(i >= m):
        break

    if(rA[i] != rB[i]):
        break
    i+=1
lst = i

#print(f"fst:{fst}, lst:{lst}")

if(n-lst > fst):
    print(n-fst-lst)
else:
    if(n < m):
        print(0)
    else:
        print(n-m)