Files
baekjoon-study/workbook_8708/silver/1515-s2.py
2026-02-23 11:14:50 +09:00

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번째를 보기까지 중복이 있긴 해서 이 부분을 고쳐야 하긴 하지만 아무튼 통과했다.
"""