Algorithm/Implementation

[백준] 3107 ipv6 (Python 파이썬)

안드선생 2021. 1. 29. 18:27
반응형

https://www.acmicpc.net/problem/3107

 

3107번: IPv6

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

www.acmicpc.net

문제 설명

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

예를 들면, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 이런 식으로 나타낸다.

 

 

문제에서는, 규칙 두가지가 존재한다.

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진수)로 복원하는 프로그램을 작성해야 한다.

 

예를 들어, 25:09:1985:aa:091:4846:374:bb 라는 입력이 주어졌을 때,

0025:0009:1985:00aa:0091:4846:0374:00bb 이런 식으로 복구하여 출력을 하면 된다.


풀이 과정

1) 입력 문자열을 ":"를 기준으로 나눠 리스트에 담는다. (ip 배열)

2) 각 칸이 4글자이면 복구 전과 후가 같으므로 그대로 옮긴다.

3) 0보다 크고 4글자 보다 작으면 0의 일부만 생략된 것이므로 그 수만큼 0을 추가한다.

4) 0글자이면 경우의 수가 두가지 이다.

    4-1) 문제에서 말한 두 번째 규칙인 연속된 그룹들이 생략된 경우

          -> 남은 칸 수( 8 - len(ip) ) 들을 모두 0으로 채운다.

    4-2) 한 그룹만 생략된 경우

          -> 해당 칸만 0으로 모두 채운다.

 

위의 과정의 소스 코드는 다음과 같다.

ip = list(input().split(":"))

index = 0
ans = ['' for _ in range(8)]
flag = 0

for i in range(len(ip)):
    if len(ip[i]) == 4:
        ans[index] = ip[i]
        index += 1

    elif len(ip[i]) > 0:
        ans[index] = '0' * (4 - len(ip[i])) + ip[i]
        index += 1

    else: # len(ip[i]) == 0
        if flag == 0:
            for j in range(8 - len(ip) + 1):
                ans[index] = '0000'
                index += 1
            flag = 1
        else:
            ans[index] = '0000'
            index += 1

for i in range(len(ans)-1):
    print(ans[i], end=':')

print(ans[-1])

https://github.com/HongEunho

 

HongEunho - Overview

📖 Android, Java, Kotlin, Algorithm. HongEunho has 15 repositories available. Follow their code on GitHub.

github.com

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

 

 

반응형