백준_IPv6_3107

Minji Lee·2024년 10월 7일
0

JS코딩테스트

목록 보기
72/122

IPv6

문제

IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.

IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.

예를 들면, 다음과 같다.

2001:0db8:85a3:0000:0000:8a2e:0370:7334

32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.

  1. 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다
2001:db8:85a3:0:00:8a2e:370:7334
  1. 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
2001:db8:85a3::8a2e:370:7334

2번째 규칙은 모호함을 방지하기 위해서 오직 한 번만 사용할 수 있다.

올바른 축약형 IPv6주소가 주어졌을 때, 이를 원래 IPv6 (32자리의 16진수)로 복원하는 프로그램을 작성하시오.

입력

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

출력

첫째 줄에, 입력으로 주어진 IPv6의 축약되지 않은 형태를 출력한다.

예제 입력 1

25:09:1985:aa:091:4846:374:bb

예제 출력 1

0025:0009:1985:00aa:0091:4846:0374:00bb

예제 입력 2

::1

예제 출력 2

0000:0000:0000:0000:0000:0000:0000:0001

Code

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

let abbreviatedIPv6 = input[0].split(':');

const noZero = abbreviatedIPv6.filter((ipv6) => ipv6 !== '');

abbreviatedIPv6 = abbreviatedIPv6.map((ipv6, index, all) => {
  if (ipv6 !== '') return ipv6.padStart(4, '0');
  else if (ipv6 === '' && all[index + 1] !== '')
    return ipv6.padStart(4, '0').repeat(8 - noZero.length);
});

let answer = '';
abbreviatedIPv6.forEach((ipv6) => {
  if (ipv6) {
    if (ipv6.length === 4) answer += ipv6 + ':';
    else {
      let [start, end] = [0, 4];
      while (end <= ipv6.length) {
        answer += ipv6.slice(start, end) + ':';
        start += 4;
        end += 4;
      }
    }
  }
});

answer = answer.slice(0, answer.length - 1);
console.log(answer);

풀이 및 해설

문자열 함수 이용

  1. : 기준으로 split해서 배열로 만들기
  2. 쪼갠 배열을 순회하면서 공백이 아니면 앞에 0으로 채우기
    공백이면 0이 축약된 것 이므로 축약된만큼 0으로 채우기 ⇒ 00000000 이런식으로 붙어서 나옴
  3. 다시 배열 순회하면서 길이가 4보다 큰 경우 4개씩 쪼개서 결과에 넣기

0개의 댓글