@@@ 알고리즘/백준 스터디

3107(IPv6) - 해결

HTG 2021. 11. 14. 11:52
728x90

IPv6

 

문제

IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.

IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.

예를 들면, 다음과 같다.

2001:0db8:85a3:0000:0000:8a2e:0370:7334

 

32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.

  1. 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다.
    2001:db8:85a3:0:00:8a2e:370:7334
  2. 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
    2001:db8:85a3::8a2e:370:7334

2번째 규칙은 모호함을 방지하기 위해서 오직 한 번만 사용할 수 있다.

올바른 축약형 IPv6주소가 주어졌을 때, 이를 원래 IPv6 (32자리의 16진수)로 복원하는 프로그램을 작성하시오.

 

입력

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

 

출력

첫째 줄에, 입력으로 주어진 IPv6의 축약되지 않은 형태를 출력한다.


0을 채우기 위해서 1번을 해결하기 위해서는 :로 구분하고 zfill을 사용하였고

2번을 해결하기 위해서 :: 가 있는지 확인하였고 생략된 갯수를 확인하였다.

replace로 해결하였다.

 

import sys
input = sys.stdin.readline

# 마지막 \n을 제거하기 위해서
pre_address = input().strip()

# ::이 있으면 생략이 되어다는 것.
if '::' in pre_address:
    # 생략된 수는 ::가 있기 때문에 
    # 8에서 :수를 빼면 생략된 수를 알 수 있다.
    num = 8 - pre_address.count(':')
    # 생략된 부분을 위해서 0으로 넣고 추가
    in_address = ':' + '0:' * num
    # ::와 in_address로 바꾼다.
    pre_address = pre_address.replace('::',in_address)

result = ''
# :로 구분하고 각 생략된 부분을 위해서 
# zfill로 채운다
for i in pre_address.split(':'):
    result += i.zfill(4) + ':'

# 마지막 :을 제거하기 위해서
print(result[:-1])