[PS] 이코테 16-36 : 편집 거리

2023. 3. 30. 20:28·Problem solving



문제
두 개의 문자열 A와 B가 주어졌을 때, 문자열 A를 편집하여 문자열 B로 만들고자 한다.

       1. 삽입(Insert) : 특정한 위치에 있는 하나의 문자를 삽입
       2. 삭제(Remove) : 특정한 위치에 있는 하나의 문자를 삭제
       3. 교체(Replace) : 특정한 위치에 있는 하나의 문자를 다른 문자로 교체

       이때 편집 거리란 문자열 A를 편집하여 문자열 B로 만들기 위해 사용한 연산의 수를 의미함, A를 B로 만드는 최소 편집 거리를 계산하는
       프로그램을 작성하시오.


입력
두 문자열 A와 B가 한 줄에 하나씩 주어짐
출력 : 최소 편집 거리를 출력

이 문제는 2차원 테이블과 점화식을 이용하여 문제를 해결할 수 있다.

<1> : su-->  sa 만든 후에 뒤에 붙어 있는 n을 t로 교체 : <1> + 교체 비용 1
<2> : sun --> sa 만든 후에 뒤에 t를 삽입 : <2> + 삽입 비용 1
<3> : su --> sat 를 만드는 비용과 비교하였을 때, sun --> sat를 만드는 비용은 1개를 삭제하는 비용만큼 더 든다 : <3> + 삭제 비용 1
<4> : s --> sat를 만드는 비용과 su --> satu를 만드는 비용은 양쪽에 동일하게 u가 더해진 것이므로 동일하다
         따라서 a[i] == b[i]일 경우 table[i-1][j-1] == table[i][j]l이다!

len(A) == len(B)의 기준이 되는 선으로 부터
좌측 방향으로 가면 A의 길이가 늘어나므로 (A^->B) : A를 삭제하여 B를 만드는 것이 됨 ==  <3>
우측 방향으로 가면 B의 길이가 늘어나므로 (A->B^) : A에 삽입하여 B를 만드는 것이 됨 == <2>
우측 아래 대각선 뱡향으로 가면 A와 B의 길이가 동일하므로 : A를 교체하여 B를 만드는 것이 됨 == <1>

따라서 정리하면 A --> B를 만들 때
1. 두 문자가 같은 경우 (a[i] == b[j])
table[i][j] == table[i-1][j-1]
2. 두 문자가 다를 경우 (a[i] != b[j])
table[i][j] = 1 + min(table[i][j-1], table[i-1][j], table[i-1][j-1])

풀이


# 16-36) 편집 거리

a = list(input()); a.insert(0, "*")
b = list(input()); b.insert(0, "*")
table = [[None for _ in range(len(b))] for _ in range(len(a))]
for i in range(len(a)): table[i][0] = i
for j in range(len(b)): table[0][j] = j
for i in range(1, len(a)):
    for j in range(1, len(b)):
        if a[i-1] == b[j-1]:
            # 이 경우 table[i-1][j-1]에서 동일한 문자 1개씩만을 추가하면 되므로 편집 거리에는 변화가 없다
            table[i][j] = table[i-1][j-1]
        else:
            table[i][j] = min(table[i-1][j], table[i][j-1], table[i-1][j-1]) + 1
print(table[len(a)-1][len(b)-1])
'Problem solving' 카테고리의 다른 글
  • [PS] 순열, 조합, 중복순열, 중복조합의 구현
  • [PS] 병합 정렬(mergeSort) 문제에서 시간 초과 오류 발생하는 경우
  • [PS] 이코테 17-39 : 화성 탐사
  • [PS] 이코테 17-38 : 정확한 순위
vysryoo
vysryoo
  • vysryoo
    vysryoo
    vysryoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Python (20)
      • Data structure (12)
      • Algorithm (14)
      • Operating system (18)
      • Programming language theory (12)
      • Computer architecture (6)
      • Softeware engineering (8)
      • Multicore (2)
      • Data Base (3)
      • Problem solving (24)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
vysryoo
[PS] 이코테 16-36 : 편집 거리
상단으로

티스토리툴바