문제가 궁금하시다면 아래의 링크를 눌러주세요!
문제 보러 가기
첫 번째 조건을 통해서도 4자리가 되지 않는 문자열에 대해 왼쪽에서부터 0을 채워넣어 각각의 자리를 채운다는 것을 알 수 있지만, ::
기호를 통해 축약된 문자열을 올바른 ip 주소로 되돌려 구현할 수 있다는 점에서 두 번째 조건이 더 중요하고, 문자열을 올바른 ip로 구현해내는 과정에서 첫 번째 조건을 활용할 수 있다는 것을 파악하는 것이 필요했다.
::
기호는 문자열 내 어느 곳에든 들어올 수 있겠지만, 크게 나누어보면 3가지의 경우가 있다.
::
이후 일반 문자열이 들어오기 전까지의 자리를 전부 0000
으로 채워넣을 수 있다.::
가 들어오는 경우::
이전과 이후 자리를 제외한 남은 영역을 전부 0000
으로 채워넣을 수 있다.::
로 끝나는 문자열::
이후의 자리를 전부 0000
으로 채워넣을 수 있다.:
을 기준으로 split
메서드를 통해 새로운 변수에 할당한다.0
을 앞에 붙여 IPv6 형태에 맞게 이어붙여준다.::
의 위치에 따라 0000
을 이어붙여준다!# 링크: https://www.acmicpc.net/source/63563281
import sys
def make_full_address(address):
temp_address = []
# ::1과 같이 ::이 문자열의 제일 앞에 온 경우
# 이 경우 split 메서드를 통해 전달된 리스트는 ['', '', 1]과 같다.
if not temp_address and address[0] == '':
# ip를 구성하는 전체 문자열 8자리 - (전달된 리스트의 요소 개수 - ''의 개수 2)
# 이를 통해 채워넣어야 할 자릿수를 구할 수 있다.
abb_idx = 8 - (len(address) - 2)
word = ["0" for _ in range(abb_idx)] + address[2:]
ipv6(word)
return
# 1::과 같이 ::이 문자열의 제일 뒤에 온 경우
# 이 경우 split 메서드를 통해 전달된 리스트는 [1, '', '']과 같다.
if address[-2:] == ['', '']:
# 채워넣어야 할 자릿수를 구하는 과정은 위와 동일하다.
abb_idx = 8 - (len(address) - 2)
word = address[:-2] + ["0" for _ in range(abb_idx)]
ipv6(word)
return
# 1::2와 같이 ::이 문자열의 중간에 온 경우
# 이 경우 전달된 리스트는 [1, '', 2]와 같다.
for i in range(len(address)):
# ''의 위치를 기준으로, 그리고 '' 다음의 요소를 기준으로 리스트 내 ''의 인덱스 순서를 파악한다.
if address[i] == '':
start = address.index(address[i])
if i > 0 and address[i - 1] == '':
end = i
else:
temp_start = start
temp_end = 8 - (len(address) - end)
# '' 이전까지의 요소를 담은 리스트, 0000을 채워넣은 리스트, '' 이후 요소들을 담은 리스트를 전부 더한다.
# 총 8개의 요소가 담긴 리스트가 만들어지고, 이를 통해 원본 ip를 구한다.
temp_address = address[:start] + ["0" for _ in range(temp_start, temp_end)] + address[end:]
ipv6(temp_address)
def ipv6(address):
ans = []
for i in address:
# 요소가 4자리가 아닌 경우, 4 - 요소의 길이를 통해 왼쪽에 채워넣어야 할 0의 개수를 알 수 있다.
zero_to_add = 4 - len(i)
temp = ("0" * zero_to_add) + i
ans.append(temp)
else:
# sep 옵션을 통해 : 구분자를 요소 사이에 넣어준다.
print(*ans, sep=':')
return
input = sys.stdin.readline
ip = input().strip()
seperate = ip.split(":")
if len(seperate) == 8:
ipv6(seperate)
else:
make_full_address(seperate)
통과!
읽어주셔서 감사합니다!
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!