[Python] 코딩 도장 - 버전비교
Updated:
코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.
코딩 도장에서 여러 문제를 확인할 수 있습니다.
난이도 순으로 차근차근 풀어보려 합니다.
[문제: 버전비교] - Lv.1
A씨는 두 개의 버전을 비교하는 프로그램을 작성해야 한다.
버전은 다음처럼 “.” 으로 구분된 문자열이다.
버전 예) 1.0.0, 1.0.23, 1.1
두 개의 버전을 비교하는 프로그램을 작성하시오.
다음은 버전 비교의 예이다.
0.0.2 > 0.0.1
1.0.10 > 1.0.3
1.2.0 > 1.1.99
1.1 > 1.0.1
출처: https://codingdojang.com/scode/493?answer_mode=hide
[풀이]
def version_compare():
input1 = input("첫 번째 버전을 입력하세요.")
input2 = input("두 번째 버전을 입력하세요.")
ver1 = input1.replace(".", "")
ver2 = input2.replace(".", "")
len_diff = len(ver1) - len(ver2)
# 숫자 길이 맞추기
if len_diff > 0:
ver2 = ver2 + "0"*abs(len_diff)
elif len_diff <0:
ver1 = ver1 + "0"*abs(len_diff)
# 버전 비교 출력
if int(ver1) > int(ver2):
print(input1, ">", input2)
elif int(ver1) < int(ver2):
print(input1, "<", input2)
else:
print(input1, "=", input2)
version_compare()
첫 번째 버전을 입력하세요.1.1
두 번째 버전을 입력하세요.1.0.1
1.1 > 1.0.1
원래는 (.)을 기준으로 split()
을 해서 자리별로 비교할까 싶었다.
다만 특정 버전은 반드시 (.)이 2개인 것이 아니어서 그런 경우 직접 (.0)을 추가 하려고 했다.
어처피 추가할거면 (.)을 다 없애고 추가해서 전체 숫자 길이를 맞추고 비교해도 된다.
따라서 숫자 길이가 다른 경우 작은쪽에 길이 차이 만큼 0을 추가하여 두 버전을 비교했다.
[추천 풀이]
from itertools import zip_longest
x = [1, 2, 3, 4]
y = [5, 6, 7]
#
pair1 = zip_longest(x, y)
print(list(pair1))
#
pair2 = zip_longest(x, y, fillvalue=0)
print(list(pair2))
[(1, 5), (2, 6), (3, 7), (4, None)]
[(1, 5), (2, 6), (3, 7), (4, 0)]
먼저 추천 풀이에 나올 zip_longest()
를 처음 봐서 먼저 정리해두고자 한다.
zip()
의 경우 두 쌍의 길이가 다르면 같은 길이까지만 쌍을 이루고 나머지는 버린다.
zip_longest()
는 두 쌍의 길이가 다르면 최대 길이까지 쌍을 이루고 없는 값은 None으로 대체된다.
fillvalue
옵션을 이용해서 None 대신 넣을 값을 지정 가능하다.
from itertools import zip_longest
def compare(left, right):
left_vars = map(int, left.split('.'))
right_vars = map(int, right.split('.'))
for a, b in zip_longest(left_vars, right_vars, fillvalue = 0):
if a > b:
return '>'
elif a < b:
return '<'
return '='
CASES = [['0.0.2', '0.0.1'],
['1.0.10', '1.0.3'],
['1.2.0', '1.1.99'],
['1.1', '1.0.1']]
if __name__ == '__main__':
for case in CASES:
print('{0[0]} {1} {0[1]}'.format(case, compare(*case)))
0.0.2 > 0.0.1
1.0.10 > 1.0.3
1.2.0 > 1.1.99
1.1 > 1.0.1
다른 분이 푸신 풀이 중 추천수가 많은 풀이이다.
map()
을 이용해서 버전을 split()
한 것을 각각 숫자형으로 바꿔주었다.
그리고 zip_longest()
로 각 숫자들을 비교해 부등호를 return 하였다.
zip_longest()
를 사용한 이유는 앞서 (.)이 반드시 2개가 아닌 경우를 위해서이다.
Leave a comment