Computer Science/알고리즘

[백준 - Python] 3107 - IPv6

바보1 2023. 5. 3. 16:53

0.  문제 링크

 

 

https://www.acmicpc.net/problem/3107

 

3107번: IPv6

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

www.acmicpc.net


1.  풀이 방법

 

 

비교적 간단했던 문제

번째는 :: 복원하는 것이다.  

파이썬의 split(':') 사용하면 : 기준으로 나누는데, 만약 앞이나 뒤에 :: 있다면리스트에 '' 개나 들어가게 된다.  

참고로 중간에 :: 있으면 '' 하나만 들어감  

아무튼 '' 개수를 세서 그게 맞게 0000 그룹을 복원함     

그 다음에는 이제 앞의 0 없어진 상황을 봐야하는데, 간단하게 길이가 4보다 작으면그만큼 0 앞에 추가하면 된다.

 

 

뒤에 short는 숏코딩 버전임 ㅎㅎ;


2.  코드

 

 

import sys
input = sys.stdin.readline


def long():
    maps = list(input().strip().split(':'))

    l = 8 - len(maps)       # ::의 개수를 세서 0000을 집어넣음
    match maps.count(''):
        case 1:
            # 1개만 있을 경우, 중간에 있다는 의미임
            maps[maps.index('')] = ('0' * 4 + ':') * l + '0000'
        case 2:
            # 2개가 있을 경우, 맨 앞 혹은 맨 뒤에 0000의 그룹이 있다는 의미임
            maps[maps.index('')] = ('0' * 4 + ':') * (l + 1) + '0000'
            maps.remove('')
    for i, num in enumerate(maps):
        if (l := len(num)) < 4:
            # 길이가 4보다 작으면 앞에 적은만큼 0을 추가해줌
            maps[i] = '0' * (4 - l) + num
    print(':'.join(maps))


def short():
    import ipaddress as _
    print(_.ip_address(input()).exploded)


if __name__ == "__main__":
    long()

3.  마무리