[Silver IV] 수학은 체육과목 입니다 3 - 22351
성능 요약
메모리: 110576 KB, 시간: 92 ms
분류
구현, 문자열, 브루트포스 알고리즘
제출 일자
2025년 5월 2일 22:04:19
문제 설명
이환이는 4차 산업혁명 시대에 살고 있는 천재 5살 아기이다. 어느 날, 유치원 선생님은 이환이의 천재성을 알아본 후 다음과 같은 문제를 내줬다.
$A$ 이상 $B$ 이하의 정수를 모두 더한 값은 얼마일까?
이환이는 천재성은 있지만 아직 아기라서 덧셈이 무엇인지는 잘 모른다. 다음 날, 이환이는 공책에 $A$ 이상 $B$ 이하의 모든 정수를 크기 순서대로 띄어쓰기 없이 적어 왔다. 예를 들어 $A = 4, B = 21$ 일 경우, 이환이가 적어 온 답은 456789101112131415161718192021과 같다.
이환이는 특출난 과제 집착력을 가진 천재지만, 이환이의 선생님은 그렇지 않다. 사실, 이환이의 선생님은 어제 본인이 부른 두 개의 수가 무엇이었는지도 잊어버렸다. 선생님이 기억하는 정보는 $A$와 $B$ 모두 $1$ 이상 $999$ 이하의 정수였고, 당연히 $A$는 $B$보다 작거나 같았다는 것뿐이다.
이환이가 적어 온 숫자들의 나열이 주어지면, 선생님이 부른 두 수를 찾을 수 있을까?
입력
첫 번째 줄에 이환이가 적어 온 답을 나타내는 문자열 $S$가 주어진다. $S$는 숫자(0123456789)로만 이루어져 있으며, 길이는 $1$ 이상 $2\ 889$ 이하이다.
출력
이환이의 선생님이 부른 두 정수 $A$와 $B$를 공백으로 구분하여 출력하라. 만약 가능한 답이 두 가지 이상이라면, 그중 $A$가 가장 작은 것을 출력하라.
이환이는 항상 정확한 답을 쓰기 때문에, 문제의 조건을 만족하는 답이 존재하는 입력만이 주어진다.
💡 해결 방법
💻 코드
def is_valid_sequence(a, s):
b = a
temp = ''
while len(temp) < len(s):
temp += str(b)
b += 1
if temp == s:
return True, b - 1
return False, -1
s = input().strip()
answer = None
for alen in range(1, 4):
a = int(s[:alen])
valid, b = is_valid_sequence(a, s)
if valid:
if answer is None or a < answer[0]:
answer = (a, b)
print(answer[0], answer[1])