2018년 12월, 처음 시작하게 된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다.
앞 글자부터 하나씩 보여주는 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해냈다!
규칙은 이러하다. 아직 보여주지 않은 문자 중 추가했을 때의 문자열이 사전 순으로 가장 앞에 오도록 하는 문자를 보여주는 것이다.
예를 들어 ZOAC를 보여주고 싶다면, A → AC → OAC → ZOAC 순으로 보여주면 된다.
바쁜 성우를 위하여 이 규칙대로 출력해주는 프로그램을 작성하시오.
첫 번째 줄에 알파벳 대문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다.
규칙에 맞게 순서대로 문자열을 출력한다.
ZOAC
A
AC
OAC
ZOAC
BAC
A
AC
BAC
STARTLINK
A
AI
AIK
AINK
ALINK
ARLINK
ARTLINK
SARTLINK
STARTLINK
import sys
input = sys.stdin.readline
n = list(input().rstrip()) # STEPBACK
# 입력이 한 글자면 그냥 그대로 출력해주고 종료
if len(n) == 1:
print(n[0])
sys.exit(0)
dic = []
for i in range(len(n)):
dic.append((n[i], i))
dic = sorted(dic) # ABCEKPST
ans = [0 for _ in range(len(n))]
ans[dic[0][1]] = dic[0][0]
while dic:
print(''.join([k for k in ans if k]))
i = 1
idx = 0
isStart = 1
while i < len(dic):
add = ans.copy()
add[dic[i][1]] = dic[i][0]
if isStart:
minimum = add
isStart = 0
elif ''.join([k for k in add if k]) < ''.join([k for k in minimum if k]):
minimum = add
idx = i
i += 1
ans = minimum
del dic[idx]
본래 문자열의 순서를 유지한 채 출력해야 하기 때문에 순서를 기억하기 위해 (문자, 인덱스)쌍이 담긴 리스트 dic을 생성했다.
BACK이라는 입력이 들어왔다고 해보자.
while문(dic에 원소가 있는 동안 계속 반복)