일단 문제를 접근할때 정방향으로 접근하는게 조금 막막하다는 생각이 들었다.
그래서 입 출력 예시를 조금 살펴봤는데
밑에서 부터 거꾸로 보면 한글자씩 빼보면서 그 녀석들중 가장 사전순으로 먼저 오는 문자열을 골라서 출력하면 되겠다는 생각이 들었다.
예를들어서
STARTLINK이면
[TARTLINK,SARTLINK,STRTLINK,...,STARTLIN] 중에서 사전순으로 가장 먼저오는 문자열을 골라낸다는 것이다.
이렇게 푼다면 대략 O(n logn) 나오기 때문에 시도할만한 풀이라고 생각했다.
a=[]
def rec(s):
if not a : a.append(s)
if len(s)==1 : return
ns = min([s[:i]+s[i+1:] for i in range(len(s))])
a.append(ns)
rec(ns)
rec(input())
print(*a[::-1],sep='\n')
나쁘지 않은 코드라고 생각하는데 몇차례의 과정을 거쳐서 숏코딩 버전으로 변환해보았다.
a=[]
def rec(s):
if not s : return
a.insert(0,s)
rec(min(s[:i]+s[i+1:] for i in range(len(s))))
rec(input())
print(*a)
무려 69B나 겉어냈다.
[사용된 기법]
not s
라는 구문을 사용했다.*
를 달아주면 스페이스바를 기준으로 출력해준다.