69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
# 수 이어 쓰기
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def check_parttern(now, target):
|
|
idx = 0
|
|
len_target = len(target)
|
|
for c1 in now:
|
|
while idx < len_target:
|
|
if c1 == target[idx]:
|
|
idx += 1
|
|
break
|
|
else:
|
|
idx += 1
|
|
else:
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
def solution():
|
|
s = input().rstrip()
|
|
len_s = len(s)
|
|
i = 0
|
|
target = 0
|
|
while i < len_s:
|
|
target += 1
|
|
j = i
|
|
while j < len_s and int(s[i:j+1]) <= target:
|
|
now = s[i:j+1]
|
|
if check_parttern(now, str(target)):
|
|
j += 1
|
|
else:
|
|
break
|
|
i = j
|
|
print(target)
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 53분
|
|
|
|
시간 복잡도: s의 길이가 3000까지가 최대라고 했기 때문에 최악의 경우 0이 3000개 있으면
|
|
target이 30000까지 간다. 즉, len(s) = n, max(target) = 10n = T이다.
|
|
근데 s의 한 숫자는 한번씩만 보는데 내 코드는 한번 볼때 다음것이 패턴이
|
|
가능하다면 중복해서 보기 때문에 O(j^2)이긴 하지만 이렇게 한번하면 그만큼 가장 최근의 것은 1번 본다.
|
|
따라서 전체 시간복잡도는 O((n+T)^2) 정도이다.
|
|
근데 s의 i번째 수를 보는 것의 중복을 없애면 O(TlogT)가 될 수 있을 것 같다.(log 밑은 10)
|
|
|
|
|
|
|
|
해설: 처음엔 문제 이해가 좀 어려웠는데 써가면서 하니까 이해가 됐다.
|
|
그리고 주어진 테스트 케이스가 엄청 복잡한 것을 보면 규칙 찾아서 하는 것이라는 걸 의심해보자.
|
|
1~10까지를 한 세트라고 했을 때 지금 보는 숫자보다 작거나 같은 숫자가 나오면 한 세트가 넘어간 것이다.
|
|
이걸로 규칙 세워서 가려고 했는데 다음 세트로 넘어갈수록 숫자가 10의 자리나 100의 자리가 생기고, 바뀌고
|
|
그러기 때문에 쉽지 않았다. -> 주어진 숫자를 쭉 보면서 답이 될 수 있는 숫자를 하나씩 키워나가자.
|
|
s의 숫자들을 하나씩 보면서 target이 될 수 있는 숫자라면, 즉 target의 substring이라면 s의 다음 숫자를 보고
|
|
target도 하나 키우는 방식으로 진행했다. 아니라면 당연히 target만 하나 키우기.
|
|
여기서 substring 구하는 방식을 s의 i번째를 확인했음에도 안쪽 while문으로 i~i+j번째까지 계속 중복 확인을 했다.
|
|
이 부분을 따로 함수로 빼서 고치든가 했어야 했다.(어차피 그래도 답은 틀림)
|
|
아무튼 나는 now in target 방법으로 진행했는데, 반례가 존재했다. s의 11이 target의 101을 대표하지 못했다.
|
|
in으로는 0이 있어서 안되기 때문이다.
|
|
따라서 target의 한 글자와 s의 한글자씩 보는 방식으로 진행했다.
|
|
역시 i~i+j번째를 보기까지 중복이 있긴 해서 이 부분을 고쳐야 하긴 하지만 아무튼 통과했다.
|
|
""" |