3107번_IPv6.py

김규리·2021년 6월 3일
0

알고리즘 풀이

목록 보기
19/20

3107번_IPv6.py

[문제 요약]

IPv6 : 128비트, 32자리, 16진수, 4자리, 클론(:)으로 구분
규칙 2가지
1. 0으로 시작하면 0 생략, 전체가 0이면 0으로 축약
2, 0으로만 이루어져 있는 그룹이 한개 이상 연속이면 ::으로 바꿀 수 있다. 단, 이 규칙은 한번만 사용가능
-> 축약을 복원하라

[문제 풀이]

1. 규칙 그대로 표현

import sys
input = sys.stdin.readline
answer = ''
hex = input().rstrip('\n').split(':')
# 몇개가 아예 생략되어 있는지 확인하기 위해 ''을 제외한 길이를 알기 위해서 
hex_len = len([v for v in hex if v])

# 규칙 2
if hex_len != 8:
    for i in range(len(hex)):
        if hex[i] == '':
            # index가 i인 곳에 생략된 '0000'을 추가
            hex = hex[:i] + ['0000'] * (8 - hex_len) + hex[i:]
            break
            
# ' ' 공백을 제거 해준다.
hex = ' '.join(hex).split()

# 규칙 1 
for i in range(len(hex)):
    if len(hex[i]) == 4:
        continue
    hex[i] = "0" * (4 - len(hex[i])) + hex[i]

answer = ':'.join(hex)
print(answer)

2. 정리된 풀이

S = input().split(":")
for i in range(len(S)):
    if S[i] == ' ':
        S[i] = "0000"
    if len(S[i]) < 4:
        S[i] = "0"*(4-len(S[i]))+S[i]
if len(S) < 8:
    for i in range(8-len(S)):
        S.insert(S.index("0000"), "0000")
if len(S) > 8:
    del S[S.index("0000")]
print(":".join(S))

0개의 댓글