📍문제 링크
https://www.acmicpc.net/problem/3107
3107번: IPv6
첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.
www.acmicpc.net
📍알고리즘 분류
- 구현
- 문자열
📍문제 풀이
- 4자리 16진수가 1 그룹이 되고, 그룹 8개가 : 로 연결된 문자를 만들자
- 그룹에서 앞부분의 0은 생략할 수 있다
- 0으로만 이루어진 그룹이 연속되어 있으면, :: 으로 축약 가능
📍의사 코드
- split(":") 을 이용해 그룹을 분리해 배열 splittedArr로 만든다
- 배열을 순회하며 그룹의 길이가 4보다 작으면, 작은만큼 0을 앞에 채워주는 함수 insertZero를 만든다
- 인수만큼 0000을 만들어주는 getZeroArr 함수를 만든다
- splittedArr 에서 공백의 인덱스를 찾는다 (spaceIdx)
공백의 인덱스가 없으면, :: 안쓰였으므로 insertZero 써서 : 으로 join 해주면 끝
공백의 인덱스가 있으면, :: 쓰였으므로, getZeroArr 함수로 채울 그룹을 준비한다. (+1 해서 생성)
- spaceIdx 를 기준으로 왼쪽, 오른쪽 배열을 나눈다 (spaceIdx 인덱스는 버림 => +1 해서 생성한 이유)
- 왼쪽, getZerroArr, 오른쪽 배열들을 스프레드 연산자로 합치고 : 로 join해서 출력
📍코드 (JavaScript)
const input = require("fs").readFileSync("/dev/stdin").toString().trim();
const splittedArr = input.split(":");
// 그룹중에 길이가 4보다 작으면 앞에 0으로 채워주는 함수
const insertZero = (arr) => {
const answer = [];
for (let el of arr) {
if (el.length < 4) {
for (let i = el.length; i < 4; i++) {
el = "0" + el;
}
}
answer.push(el);
}
return answer;
};
// 0000 으로 배열 만들어 리턴하는 함수
const getZeroArr = (num) => {
return Array(num).fill("0000");
};
// 여기서 공백의 인덱스 기록
// -1 이면 :: 없는 것
// 0보다 크면 :: 있음
const spaceIdx = splittedArr.indexOf("");
// :: 없는 경우
if (spaceIdx === -1) {
console.log(insertZero(splittedArr).join(":"));
// :: 있는 경우
} else {
// 0으로 앞 채우기
const insertedArr = insertZero(splittedArr);
const totalLen = splittedArr.length;
const needSpace = 8 - totalLen;
// 0000 배열 준비, spaceIdx의 배열은 빠질 것이기 때문에 +1 해서 생성
const zeroArr = getZeroArr(needSpace + 1);
// 없으면 빈배열 나올것임
const leftArr = insertedArr.slice(0, spaceIdx);
const rightArr = insertedArr.slice(spaceIdx + 1);
console.log([...leftArr, ...zeroArr, ...rightArr].join(":"));
}