소프트웨어 개발에서 두 패키지의 버전을 비교해야 하는 상황은 매우 흔합니다. 이번 글에서는 "major.minor.patch" 형식의 두 버전 문자열이 주어졌을 때, 새 버전(newer)이 이전 버전(older)보다 실제로 최신인지 확인하는 Python 프로그램을 만들어 보겠습니다.
문제 정의
예를 들어, older = "7.2.2", newer = "7.3.1"이 입력으로 주어진다면, newer가 더 높은 버전이므로 출력은 True가 됩니다.
버전 번호는 점(.)을 기준으로 세 부분으로 나뉩니다.
- major: 큰 업데이트 또는 호환성이 깨지는 변경
- minor: 기능 추가 등 중간 규모의 업데이트
- patch: 버그 수정 등 작은 변경 사항
해결 알고리즘
두 버전을 비교하는 핵심 아이디어는 각 자릿수를 왼쪽부터 순서대로 비교하는 것입니다. 단계별로 살펴보면 다음과 같습니다.
- older 문자열을 점(.)을 기준으로 분할하여 major, minor, patch 값의 리스트로 만듭니다.
- newer 문자열도 같은 방식으로 리스트로 변환합니다.
- 두 리스트를 앞에서부터 한 요소씩 비교합니다.
- n > o이면 newer가 더 최신이므로 True를 반환합니다.
- n < o이면 newer가 더 오래된 버전이므로 False를 반환합니다.
- 모든 자릿수가 같다면 두 버전은 동일하므로 False를 반환합니다.
구현 예제
위 알고리즘을 Python 코드로 구현하면 다음과 같습니다.
class Solution:
def solve(self, older, newer):
older = older.split('.')
newer = newer.split('.')
for o, n in zip(older, newer):
if int(n) > int(o):
return True
elif int(n) < int(o):
return False
return False
ob = Solution()
older = "7.2.2"
newer = "7.3.1"
print(ob.solve(older, newer))입력
"7.2.2", "7.3.1"
출력
True
코드 설명
split('.') 메서드는 버전 문자열을 점을 기준으로 나누어 ['7', '2', '2']와 같은 리스트를 생성합니다. 이후 zip() 함수를 사용해 두 리스트의 요소를 동시에 순회하며, int()로 변환한 후 대소를 비교합니다.
문자열 그대로 비교하지 않고 반드시 정수로 변환해야 하는 이유는, 문자열 비교 시 '10'이 '9'보다 작다고 잘못 판단될 수 있기 때문입니다. 정수 변환을 통해 올바른 수치 비교가 가능합니다.
이 프로그램의 시간 복잡도는 O(n)이며, 여기서 n은 버전 문자열의 길이입니다. 버전 문자열은 일반적으로 매우 짧기 때문에 실질적으로 상수 시간에 가까운 성능을 보입니다.