[Python] 백준 3107 IPv6 (String)

선주·2022년 1월 26일
0

Python PS

목록 보기
33/65
post-thumbnail

📌 문제

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의 축약되지 않은 형태를 출력한다.

예제 입력 1

25:09:1985:aa:091:4846:374:bb

예제 출력 1

0025:0009:1985:00aa:0091:4846:0374:00bb

예제 입력 2

::1

예제 출력 2

0000:0000:0000:0000:0000:0000:0000:0001

📌 풀이

💬 Code

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=':')

💡 Solution

아이디어는 이렇다. 콜론을 기준으로 문자를 나눠서 리스트 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이 될 때까지 생략된 자리를 삭제해준다.

profile
기록하는 개발자 👀

0개의 댓글