철자 추천

시간 제한12초메모리 제한128 MB

요약
키보드 근접 치환과 전위를 포함한 가중 편집 거리를 사용해 각 질의 단어에 가장 가까운 사전 단어를 찾는다.
난이도

어려움10점 중 8점

유형
동적 계획법, 문자열, 해시맵, 트라이
정답자
아직 제출이 없습니다

문제

철자 추천(spelling suggestion)은 철자 교정 프로그램의 한 부분으로, 잘못 입력했을 가능성이 큰 단어에 대해 그럴듯한 대체 단어를 제안한다. 대체 단어가 얼마나 적절한지는 잘못된 단어와의 편집 거리(edit distance)로 평가할 수 있다. 편집 거리는 한 단어를 다른 단어로 바꾸는 데 필요한 편집 연산들의 총 비용이다.

허용되는 편집 연산과 그 비용은 다음과 같다.

  • 삽입: 문자 하나를 끼워 넣는다. 비용 2.
  • 삭제: 문자 하나를 지운다. 비용 2.
  • 전치(transposition): 인접한 두 문자의 순서를 맞바꾼다. 비용 2.
  • 치환: 한 문자를 다른 문자로 바꾼다. 두 문자가 키보드에서 서로 가까우면(근접 치환) 비용 1, 그렇지 않으면(원거리 치환) 비용 2. 같은 문자를 그대로 두면 비용 0.

예를 들어 wonder에서 o를 삭제하면 wnder, o를 a로 치환하면 wander, er를 전치하면 wondre가 된다.

두 단어 사이의 최소 편집 거리는 가능한 모든 연산 순서 중 가장 작은 총 비용이다. 입력 단어와의 최소 편집 거리가 더 작은 사전 단어일수록 더 좋은 철자 추천이다.

어떤 문자 쌍이 서로 가까운지는 (영문 QWERTY 자판을 기준으로 한) 근접 치환 규칙 집합으로 주어진다. 근접 치환은 대칭이다. 즉, 문자 y가 문자 x의 근접 치환 대상으로 주어지면, x를 y로 바꾸는 것과 y를 x로 바꾸는 것 모두 비용이 1이다.

각 입력 단어에 대해, 그 단어와의 최소 편집 거리가 가장 작은 사전 단어(들)를 구하라.

입력

입력은 표준 입력으로 주어지며 세 부분으로 이루어진다. 각 부분은 빈 줄로 끝나므로, 세 번째 부분 뒤의 빈 줄이 입력의 끝을 나타낸다.

첫 번째 부분 — 근접 치환 규칙 (최대 150줄). 각 줄은 공백 하나로 구분된 두 필드로 이루어진다.

  • 첫 번째 필드는 한 개의 문자이다.
  • 두 번째 필드는 그 문자와 근접 치환할 수 있는 문자들의 나열이다(공백 없음).

근접 치환은 대칭이다. 이 부분에 등장할 수 있는 문자는 일반적인 영문 자판으로 입력할 수 있는 영숫자와 일부 문장 부호이다(공백과 탭 제외).

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+\|[{]};:',<.>/?

두 번째 부분 — 사전 (최대 150,000개 단어). 한 줄에 한 단어씩 주어진다. 사전 단어는 아래 영문자와 아포스트로피(')로 이루어진다.

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

세 번째 부분 — 검사할 단어 (최대 5,000개 단어). 한 줄에 한 단어씩 주어지며, 첫 번째 부분과 같은 문자 집합을 사용한다.

출력

세 번째 부분의 각 단어에 대해, 콜론(:)으로 구분된 세 필드를 한 줄에 출력한다.

  • 입력 단어.
  • 입력 단어와 가장 가까운 사전 단어(들) 사이의 최소 편집 거리.
  • 그 최소 편집 거리를 달성하는 모든 사전 단어를 오름차순으로, 공백 하나로 구분하여 출력한다. 마지막 단어 뒤에는 공백을 두지 않는다.

정렬은 문자 코드(바이트/ASCII) 순서를 따른다. 따라서 숫자가 대문자보다, 대문자가 소문자보다 앞선다.

예제2

  1. 예제 1

    입력
    a AqQsSzZ
    b BgGvVnN
    p P0);:oO[{
    r R4$fFeEtT
    z ZaAxX
    
    a
    A
    b
    B
    Z
    angel
    angle
    anger
    angry
    ABC
    
    x
    s
    z
    xx
    xxx
    angre
    angri
    angrt
    angel
    ACB
    BAC
    CAB
    
    예상 출력
    x:2:A B Z a b
    s:1:a
    z:1:A Z a
    xx:4:A B Z a b
    xxx:6:A ABC B Z a b
    angre:2:anger angle angry
    angri:2:angry
    angrt:2:anger angry
    angel:0:angel
    ACB:2:ABC
    BAC:2:ABC
    CAB:4:A ABC B
    
  2. 예제 2

    입력
    
    cat
    dog
    cot
    
    cat
    cot
    bat
    
    
    예상 출력
    cat:0:cat
    cot:0:cot
    bat:2:cat