Skip to main content

3107 - IPv6

info
  • 문제 보기: 3107 - IPv6
  • 소요 시간: 💥1시간 초과
  • 풀이 언어: python
  • 체감 난이도: 2️⃣
  • 리뷰 횟수: ✅

풀이 키워드

스포주의

구현 문자열


풀이 코드

info
  • 메모리: 31120 KB
  • 시간: 32 ms
import sys
input = sys.stdin.readline

def solution():
addr = input().rstrip().split(':')
#print('addr:', addr)
ans = []

found = False
for e in addr:
if e == '':
if found:
addr.remove(e)
else:
found = True

# count after process
zcnt = 0
if found:
zcnt = 8 - len(addr) + 1 # include ''

zlist = ['0000'] * zcnt
#print(zlist)

for i, e in enumerate(addr):
if e == '':
ans.extend(zlist)
else:
ez = e.zfill(4)
ans.append(ez)

print(':'.join(x for x in ans))

if __name__ == '__main__':
solution()

풀이 해설

python에서 쉽게 문자열 패딩을 넣는 방법엔 zfillljust, rjust가 있다.

zfill은 부호를 가장 왼쪽에 두는 작동방식의 차이가 있지만 본 문제와는 무관하므로 해당 메소드를 사용했다.

sys.stdin.readline은 개행을 포함하여 읽어들이므로, split 하기 전 rstrip 처리가 필요하다 (해당 처리 안할 시 채점 진도가 바뀌는 것으로 보아 예제에서 문제 없다고 해도 안하면 안됨)

입력 케이스는 ::이 존재하는지, 그리고 존재한다면 어느 위치에 있는지에 따라 크게 4가지로 구분된다.

각각의 케이스에 따라 split한 결과는 다음과 같다.

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

# 결과
['1', '2', '3', '4', '5', '6', '7', '8']

이와같이 ''의 개수가 케이스마다 다르므로 사전에 1개만 남기고 없애는 전처리를 수행하고,

해당 전처리 과정을 통해 ''가 존재했는지에 따라 플래그를 설정하여 후에 zcnt 계산에 사용한다.

존재했다면 몇 개의 0000을 넣어야 하는지 전처리된 len(addr)을 통해 계산한다. 존재하지 않았다면 당연히 0이다.

후처리는 규칙에 따라 기존 데이터를 패딩하고 append할 것인지, 아니면 0000 묶음을 extend할 것인지 결정하면 된다.


메모

  • 데이터 크기가 고정적이거나 크지 않으면 실수를 최소화할 수 있는 알고리즘이 나음. 이건 PS 문제니까.
    • 처음에 append 안하고 인덱스 계산만으로 시도하다가 풀이시간 폭망해서 하는 소리 아님