본문 바로가기
코딩테스트/Python

[python 백준 3107] IPv6

by nahkim 2023. 3. 13.

📜 접근 방법

1. ":"를 기준으로 문자열을 쪼갠다.

2. 쪼갠 문자열을 for문을 돌린다.

3. 빈 문자열일 경우 현재 문자열 갯수만큼 "0000:"을 추가한다.

4. 빈 문자열이 아닐 경우 (4 - s의 갯수)만큼 0을 추가한 후 문자열 s + : 를 추가한다.

 

❌ 실패 코드

import sys

s_list = sys.stdin.readline().strip().split(":")
res = ""
check = True

for s in s_list:
    if s == "":
        if check:
            if len(s_list) < 8:
                for i in range(8 - len(s_list)):
                    res += "0000:"
            check = False
        res += "0000:"
    else:
        if len(s) != 4:
            for i in range(4 - len(s)):
                res += "0"
            res += s
        else:
            res += s
        res += ":"
print(res[:-1])

반례

입력 : 1:2:3:4:5:6:7::

정답 : 0001:0002:0003:0004:0005:0006:0007:0000

출력 : 0001:0002:0003:0004:0005:0006:0007:0000:0000

 

즉, 1::, :: 을 고려해야한다. 이는 split(":")를 할 경우, 문자열이 3개가 되기 때문이다.

생각해보니 위의 if문은 필요 없고 for문에서 (8 - 쪼갠 문자열 갯수) + 1을 하고, else문으로 바꿔주면 되는 문제였다.

 

✅ 정답 코드

import sys

s_list = sys.stdin.readline().strip().split(":")
res = ""
check = True

for s in s_list:
    if s == "":
        if check:
            for i in range(8 - len(s_list) + 1):
                res += "0000:"
            check = False
        else:
            res += "0000:"
    else:
        if len(s) != 4:
            res += "0" * (4 - len(s))
        res += s + ":"
print(res[:-1])

 

 

💡알게 된점