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에서 쉽게 문자열 패딩을 넣는 방법엔 zfill
과 ljust
, 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
# 결과
['', '', '1']
# 입력
1:2:3::5:6:7
# 결과
['1', '2', '3', '', '5', '6', '7']
# 입력
1::
# 결과
['1', '', '']
이와같이 ''
의 개수가 케이스마다 다르므로 사전에 1개만 남기고 없애는 전처리를 수행하고,
해당 전처리 과정을 통해 ''
가 존재했는지에 따라 플래그를 설정하여 후에 zcnt
계산에 사용한다.
존재했다면 몇 개의 0000
을 넣어야 하는지 전처리된 len(addr)
을 통해 계산한다. 존재하지 않았다면 당연히 0이다.
후처리는 규칙에 따라 기존 데이터를 패딩하고 append
할 것인지, 아니면 0000
묶음을 extend
할 것인지 결정하면 된다.
메모
- 데이터 크기가 고정적이거나 크지 않으면 실수를 최소화할 수 있는 알고리즘이 나음. 이건 PS 문제니까.
- 처음에
append
안하고 인덱스 계산만으로 시도하다가 풀이시간 폭망해서 하는 소리 아님
- 처음에