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의 축약되지 않은 형태를 출력한다.
25:09:1985:aa:091:4846:374:bb
0025:0009:1985:00aa:0091:4846:0374:00bb
::1
0000:0000:0000:0000:0000:0000:0000:0001
adr = list(input().split(':'))
if adr.count(''):
while len(adr) > 8:
del adr[adr.index('')]
while len(adr) < 8:
adr.insert(adr.index(''), '0000')
for i in range(8):
if len(adr[i]) < 4:
adr[i] = '0'*(4-len(adr[i])) + adr[i]
print(*adr, sep=':')
아이디어는 이렇다. 콜론을 기준으로 문자를 나눠서 리스트 adr에 저장한다.
그리고 adr의 원소 8개를 하나씩 체크하면서 길이가 4보다 작은 원소의 앞을 0으로 채워줘 길이가 4가 되게 만든다. 첫번째 규칙은 이렇게 클리어~!
for i in range(8):
if len(adr[i]) < 4:
adr[i] = '0'*(4-len(adr[i])) + adr[i]
두번째 규칙 클리어를 위해 생략된 0그룹을 복원시켜주자.
🔸 생략된 0 그룹이 여러개인 경우
# input ::1 (원래 형태 0000:0000:0000:0000:0000:0000:0001)
print(adr) # ['', '', '1']
이렇게 adr 길이가 8보다 작을 수밖에 없다.
if adr.count(''):
while len(adr) < 8:
adr.insert(adr.index(''), '0000')
따라서 adr 길이가 8이 될 때까지 생략된 자리에 0000을 삽입해준다.
🔸 생략된 0 그룹이 하나인 경우
# input 1:2::3:4:5:6:7 (원래 형태 0001:0002:0000:0003:0004:0005:0006:0007)
print(adr) # ['', '1', '2', '3', '4', '5', '6', '7']
adr 길이 8 → 문제 없음
# input ::1:2:3:4:5:6:7 (원래 형태 0000:0001:0002:0003:0004:0005:0006:0007)
print(adr) # ['', '', '1', '2', '3', '4', '5', '6', '7']
adr 길이 9 → 문제임. 아마 오답판정 받았다면 이렇게 0그룹 하나가 주소의 처음 또는 끝에서 생략된 경우를 고려 안해줬을 확률이 높다. 나도 얘 때문에 삽질함 ^_ㅠ
if adr.count(''):
while len(adr) > 8:
del adr[adr.index('')]
따라서 adr 길이가 8이 될 때까지 생략된 자리를 삭제해준다.