https://www.acmicpc.net/problem/1075
n = int(input()[:-2] + '00')
f = int(input())
if n % f == 0:
print('00')
else:
tmp = n // f * f
print(str(tmp + f)[-2:])
이번 문제도 문제 자체가 어렵다기 보다는 약간 머리를 굴려야 하는 문제입니다. n의 10의 자리수, 1의 자리수를 바꿔서 f의 가능한 한 작은 배수를 만들 수 있는 두 숫자를 출력해야 합니다. 쉽게 보면 그냥 최대한 근접한 f의 배수를 찾으면 되는 거 아닌가 싶을 수 있겠지만 뒤에서 두 자리를 바꿔야 한다는 조건과 가장 작은 배수를 만들어야 한다는 조건이 걸립니다. 입력 예시 1을 예시로 설명을 드리자면,
1000
3
의 n, f가 주어질 때 단순하게 나누기만 한다면 가장 1000에 가까운 f의 배수는 999가 됩니다만, 이 경우 10xx의 숫자가 아니므로 정답이 될 수 없습니다. 또, 예를 들어 n이 1000이 아니라 1099일 때 단순하게 나눈다면 f의 배수는 1098이 되어 가장 작은 수라는 조건을 만족할 수 없게됩니다.
그래서 저는 처음에 입력을 받을 때 부터 n을 바꿀 수 있는 두 자리를 0으로 받아서 f로 나눴을 때 나눠 떨어진다면 그게 가장 작은 수이니 00을 출력하고 그렇지 않은 경우 f의 배수가 n보다 작은 것이 확실하므로 배수에 f를 더한 수의 뒤에서 두자리를 출력하는 방식으로 문제를 해결했습니다.
추가//
가장 빠른 시간에 푸신 분들의 풀이를 보면 반복문을 이용해서 n이 나눠떨어지면 반복문을 멈추고 그렇지 않으면 n을 1씩 증가시켜가면서 가장 작은 수를 찾는 방법을 사용했습니다. 반복문에서 지속적으로 나누는 연산을 하기 때문에 시간이 오래걸리는 방법일 것이라 생각해서 시도해보지 않았는데 의외로 더 빠른 시간이 나왔네요.
n = int(input()[:-2] + '00')
f = int(input())
while True:
if n % f == 0:
break
n += 1
print(str(n)[-2:])
해당 방식대로 수정한 코드입니다. 저는 실행 시간에 변화는 없었네요.
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ][Python]1032 풀이 (0) | 2023.06.25 |
---|---|
[BOJ][Python]1076 풀이 (0) | 2023.06.24 |
[BOJ][Python]1009 풀이 (0) | 2023.06.22 |
[BOJ][Python]1247 풀이 (0) | 2023.06.21 |