이환이는 4차 산업혁명 시대에 살고 있는 천재 5살 아기이다. 어느 날, 유치원 선생님은 이환이의 천재성을 알아본 후 다음과 같은 문제를 내줬다.
이상 이하의 정수를 모두 더한 값은 얼마일까?
이환이는 천재성은 있지만 아직 아기라서 덧셈이 무엇인지는 잘 모른다. 다음 날, 이환이는 공책에 이상 이하의 모든 정수를 크기 순서대로 띄어쓰기 없이 적어 왔다. 예를 들어 일 경우, 이환이가 적어 온 답은 456789101112131415161718192021과 같다.
이환이는 특출난 과제 집착력을 가진 천재지만, 이환이의 선생님은 그렇지 않다. 사실, 이환이의 선생님은 어제 본인이 부른 두 개의 수가 무엇이었는지도 잊어버렸다. 선생님이 기억하는 정보는 와 모두 이상 이하의 정수였고, 당연히 는 보다 작거나 같았다는 것뿐이다.
이환이가 적어 온 숫자들의 나열이 주어지면, 선생님이 부른 두 수를 찾을 수 있을까?
첫 번째 줄에 이환이가 적어 온 답을 나타내는 문자열 가 주어진다. 는 숫자(0123456789)로만 이루어져 있으며, 길이는 이상 이하이다.
이환이의 선생님이 부른 두 정수 와 를 공백으로 구분하여 출력하라. 만약 가능한 답이 두 가지 이상이라면, 그중 가 가장 작은 것을 출력하라.
이환이는 항상 정확한 답을 쓰기 때문에, 문제의 조건을 만족하는 답이 존재하는 입력만이 주어진다.
예외 케이스를 제대로 생각을 못해서 꽤 고생했다...
910911이 입력인 경우에 910 911이 정답인데 잘못 코드를 짜서 계속 틀렸었다.
푼 방법은 우선 A가 한자리수인 경우, 두자리수인 경우, 세자리수인 경우를 순서대로 확인하며 A부터 1씩 증가시킨 수를 입력받은 문자열 처음에 있는지 확인해가며 있으면 해당 부분을 제거하고 없으면 자릿수를 증가시켜서 다시 진행하는 방식으로 풀었다.
import sys
nums = sys.stdin.readline().rstrip()
splits = nums
for i in range(1,4):
start_num = splits[0:i] # 한자리수인 경우부터 순서대로 확인(이 때 start_num은 A로 설정됨)
min_num = start_num # A
while splits and splits[:len(start_num)] == start_num: # 숫자가 남아있고 이번에 확인할 숫자가 문자열에 있는 경우
splits = splits[len(start_num):] # 문자열에서 해당 숫자 제거
start_num = str(int(start_num)+1) # 현재 숫자에 +1해서 다음 숫자 확인
if not splits: # 다음 숫자 없으면 멈춤. 조건 안맞아서 while 끝나는 경우 대비용
break
splits = nums
print(min_num, int(start_num)-1)