https://www.acmicpc.net/problem/3107
문제 설명
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])
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
'Algorithm > Implementation' 카테고리의 다른 글
[백준] 1193 분수찾기 (Python 파이썬) (0) | 2021.04.12 |
---|---|
[백준] 5212 지구온난화 (Python 파이썬) (0) | 2021.01.29 |
[백준] 14500 테트로미노 (Python 파이썬) (0) | 2021.01.28 |
[백준] 8911번 거북이 (Python 파이썬) (0) | 2021.01.28 |
[백준] 3020번 개똥벌레 (Python 파이썬) 누적합 (0) | 2021.01.27 |