아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가역 압축

시간 제한2초메모리 제한1024 MB

요약
주어진 숫자열로 복원되고 부호열을 뒤집어도 같은 숫자열로 복원되는 가장 짧은 부호열을 찾습니다. 길이가 같으면 사전순으로 가장 앞선 것을 출력합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 문자열, 시뮬레이션
정답자
아직 제출이 없습니다

문제

데이터 압축은 정보 사회에서 필수적인 기술이다. 압축은 주어진 문자열을 (가능하면) 더 짧은 부호 문자열로 바꾸어 저장하거나 전송을 효율적으로 하게 한다.

부호 문자열을 뒤집어도 원래 문자열로 복호할 수 있는 새로운 압축 알고리즘을 설계하려고 한다. 현재 검토 중인 후보 명세는 다음과 같다.

  • 주어진 문자열은 십진수 숫자의 열이다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9이다.
  • 부호 문자열은 부호 단어의 열이다. 부호 단어는 십진수 두 자리 A와 L로 이루어진다. 따라서 부호 문자열은 짝수 개의 십진수 자리로 이루어진 열이다.
  • 부호 문자열 A11L11 ⋯\cdots AkkLkk는 아래 절차로 문자열에 복호된다. 편의상 십진수 자리(Aii 또는 Lii)는 그 자리가 나타내는 한 자리 정수로도 취급한다.
i <- 1
while i <= k:
    if A_i가 0이면: L_i를 출력
    else if L_i가 0이면: 아무 것도 하지 않음
    else if A_i가 지금까지 출력된 자리 수보다 크면: 오류 발생
    else: L_i번 반복하여, 지금까지 출력된 자리 중 뒤에서 A_i번째 자리를 출력
    i <- i + 1

예를 들어 부호 문자열 000125는 다음과 같이 0101010으로 복호된다.

  1. 첫 부호 단어 00은 0을 출력한다.
  2. 둘째 부호 단어 01은 1을 출력한다.
  3. 마지막 부호 단어 25의 첫 자리 2는 지금까지 복호된 자리를 뒤에서 셀 때 두 번째 자리를 출력하라는 뜻이다. 이를 다섯 번 반복한다. 첫 번째 반복에서 지금까지 복호된 자리는 0, 1이므로 뒤에서 두 번째인 0을 출력한다. 두 번째 반복에서는 0, 1, 0이므로 뒤에서 두 번째인 1을 출력한다. 나머지 세 번은 차례로 0, 1, 0을 출력한다.

오류 없이 끝나는 부호 단어의 열을 유효한 부호 문자열이라고 한다. 유효한 부호 문자열을 뒤집은 것도 유효하고, 원래 문자열과 뒤집은 문자열이 같은 문자열로 복호될 때, 그 부호 문자열은 가역적이다.

예를 들어 000125는 뒤집은 521000이 오류를 일으키므로 유효하지 않고, 따라서 가역적이지 않다. 0010은 뒤집은 0100이 유효하지만, 0010은 0으로, 0100은 10으로 복호되므로 가역적이지 않다. 반면 0015599100은 자신과 뒤집은 0019955100이 모두 00000000000000000으로 복호되므로 가역적이다.

이 압축 방식의 성능을 다양한 경우에서 평가하려고 한다. 임의의 숫자 문자열이 주어졌을 때, 그 문자열로 복호되는 가역적 부호 문자열 가운데 가장 짧은 것을 찾는 프로그램을 작성하라.

입력

십진수 숫자로 이루어진 비어 있지 않은 문자열 ss가 한 줄에 주어진다. ss의 길이는 500을 넘지 않는다.

출력

ss로 복호되는 가장 짧은 가역적 부호 문자열을 출력한다. 가장 짧은 해가 여럿이면 사전순으로 가장 앞선 것을 출력한다. 입력 문자열이 무엇이든 가역적 부호 문자열은 항상 존재한다.

예제4

  1. 예제 1

    입력
    00000000000000000
    
    예상 출력
    0015599100
    
  2. 예제 2

    입력
    0101010
    
    예상 출력
    000122221000
    
  3. 예제 3

    입력
    123123123123123123123123123123
    
    예상 출력
    01020336699993302010
    
  4. 예제 4

    입력
    123456789
    
    예상 출력
    010203040506070809908070605040302010