diff --git a/workbook_8708/1515-s2.py b/workbook_8708/1515-s2.py new file mode 100644 index 0000000..12ba255 --- /dev/null +++ b/workbook_8708/1515-s2.py @@ -0,0 +1,69 @@ +# 수 이어 쓰기 + +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번째를 보기까지 중복이 있긴 해서 이 부분을 고쳐야 하긴 하지만 아무튼 통과했다. +""" \ No newline at end of file