https://www.acmicpc.net/problem/2869
2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
오늘 백준에 들어갔더니 재채점된 문제가 있더라구요. 항상 재채점을 해도 틀리지 않았었는데 이번엔 시간초과로 틀렸길래 좀 봤더니 알고리즘 개선이 가능할 것이라는 생각이 들어서 소개도 시켜드릴 겸 풀이를 진행해보겠습니다.
시간 초과 코드
A, B, V = map(int, input().split())
n=int(V/(A-B)-A)
while True:
if (A-B)*n+A>=V:
print(n+1)
break
else:
n += 1
사실 프로그래밍을 하다보면 예전에 짜놓은 코드를 볼 때 도대체 왜 이렇게 해놨지 하는 심정이 들곤 하는데요. 순간적으로 봤을 때 이게 뭐지 싶은 느낌이 들더군요. 잠깐 위의 코드를 알아보자면, 입력을 받아서 연산을 진행한 다음 출력을 하는 방식인데 위에서 n을 구하는 식을 만들어놓고는 반복문을 실행시키는 신기한 짓을 하고 있죠? 도통 이해가 안되는 코드를 짜놔서 이번에 수정을 좀 했습니다(저게 어떻게 맞았는지도 영...).
정답 코드
import math
a,b,v = map(int, input().split())
n = math.ceil((v-a)/(a-b))
print(n+1)
#O(1)
빨리 구현하고 치울 생각으로 math 라이브러리를 사용했구요. 소수점 아래 한자리가 0인 경우가 있고 그렇지 않은 경우가 있는데 달팽이 이동의 최소 단위가 1일 이기에 ceil()함수로 올림을 진행하고 n+1을 출력하면 되는 간단한 코드입니다. 훨씬 짧아지고 가독성도 좋아졌죠? 거기다 시간복잡도도 O(1)이 되었으니 시간 초과도 생기지 않고 깔끔하게 돌아갑니다.
이렇게 오늘은 예전 코드를 수정하는 시간을 가져봤는데요. 가끔 이렇게 예전 코드를 볼 때면 그래도 내가 조금씩 성장을 하고 있구나 하는 마음이 들어서 뿌듯하기도 합니다.
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ][Python]1427번 풀이 (0) | 2021.11.25 |
---|---|
[BOJ][Python]2108번 풀이 (0) | 2021.11.24 |
[BOJ][Python]16139번 풀이 (0) | 2021.10.31 |
[BOJ][Python]백준 문제 풀이 10172번 - 개 (0) | 2021.09.03 |