3107. IPv6

Rin01·2023년 7월 16일
0

problem_solving

목록 보기
16/24

문제가 궁금하시다면 아래의 링크를 눌러주세요!
문제 보러 가기

접근 과정

두 번째 조건이 더 중요하다

첫 번째 조건을 통해서도 4자리가 되지 않는 문자열에 대해 왼쪽에서부터 0을 채워넣어 각각의 자리를 채운다는 것을 알 수 있지만, :: 기호를 통해 축약된 문자열을 올바른 ip 주소로 되돌려 구현할 수 있다는 점에서 두 번째 조건이 더 중요하고, 문자열을 올바른 ip로 구현해내는 과정에서 첫 번째 조건을 활용할 수 있다는 것을 파악하는 것이 필요했다.

::의 위치에 따른 구현 변화

:: 기호는 문자열 내 어느 곳에든 들어올 수 있겠지만, 크게 나누어보면 3가지의 경우가 있다.

::로 시작하는 문자열

  • 이 경우, 전체 8자리의 4글자 문자열 중 :: 이후 일반 문자열이 들어오기 전까지의 자리를 전부 0000으로 채워넣을 수 있다.

문자열의 중간에 ::가 들어오는 경우

  • 이 경우, 전체 8자리의 4글자 문자열 중 :: 이전과 이후 자리를 제외한 남은 영역을 전부 0000으로 채워넣을 수 있다.

::로 끝나는 문자열

  • 이 경우, 전체 8자리의 4글자 문자열 중 :: 이후의 자리를 전부 0000으로 채워넣을 수 있다.

정리하면?

  • 주어진 문자열을 :을 기준으로 split 메서드를 통해 새로운 변수에 할당한다.
  • 만약 문자열의 길이가 8이라면, 첫 번째 조건에 맞게 리스트 내의 각 요소를 순회하며 길이가 4가 아닌 경우 0을 앞에 붙여 IPv6 형태에 맞게 이어붙여준다.
  • 문자열의 길이가 8보다 작은 경우, :: 의 위치에 따라 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)

통과!

읽어주셔서 감사합니다!

profile
즐거워요

2개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

1개의 답글