728x90
IPv6
문제
IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.
IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.
예를 들면, 다음과 같다.
2001:0db8:85a3:0000:0000:8a2e:0370:7334
32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.
- 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다.
2001:db8:85a3:0:00:8a2e:370:7334
- 만약 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])
'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글
12887(경로 게임) - 해결 (0) | 2021.11.16 |
---|---|
1461(도서관) - 해결 (0) | 2021.11.14 |
9660(돌 게임 6) - 해결 (0) | 2021.11.14 |
16884(나이트 게임) - 해결 - 이유 찾음 (0) | 2021.11.07 |
17144(미세먼지 안녕!) - 해결 (0) | 2021.11.06 |