[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