Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 두 IP 주소 사이의 IP 주소 개수 계산하는 방법

문제 정의

두 개의 IPv4 주소를 입력받아, 두 주소 사이에 존재하는 IP 주소의 개수를 반환하는 JavaScript 함수를 작성해야 합니다. 이때 첫 번째 주소는 포함하고, 마지막 주소는 제외합니다.

가장 간단한 풀이 방법은 각 IP 주소를 하나의 10진수 정수로 변환한 뒤, 두 값의 절대 차이를 구하는 것입니다. IPv4 주소는 0~255 범위의 옥텟 4개로 구성되며, 각 옥텟은 256진법의 자릿값을 가지므로 아래 가중치를 곱해 하나의 정수로 변환할 수 있습니다.

  • 첫 번째 옥텟: 256³ = 16,777,216
  • 두 번째 옥텟: 256² = 65,536
  • 세 번째 옥텟: 256¹ = 256
  • 네 번째 옥텟: 256⁰ = 1

예제 코드

다음은 위 방식을 구현한 전체 코드입니다 -

const ip1 = '20.0.0.10';
const ip2 = '20.0.1.0';

const countIp = (ip1, ip2) => {
    let diff = 0;
    const aIp1 = ip1.split('.');
    const aIp2 = ip2.split('.');

    // 형식 검증: 옥텟은 반드시 4개여야 합니다
    if (aIp1.length !== 4 || aIp2.length !== 4) {
        return 'Invalid IPs: incorrect format';
    }

    for (let x = 0; x < 4; x++) {
        // 값 검증: 각 옥텟은 0~255 사이의 숫자여야 합니다
        if (
            isNaN(aIp1[x]) || isNaN(aIp2[x])
            || aIp1[x] < 0 || aIp1[x] > 255
            || aIp2[x] < 0 || aIp2[x] > 255
        ) {
            return 'Invalid IPs: incorrect values';
        }
        // 자릿값(256의 거듭제곱)을 곱해 차이를 누적합니다
        diff += (aIp1[x] - aIp2[x]) * (256 ** (3 - x));
    }
    return Math.abs(diff);
};

console.log(countIp(ip1, ip2));

코드 동작 원리

  1. 옥텟 분리: split('.')으로 IP 문자열을 네 개의 옥텟으로 나눈 배열로 변환합니다.
  2. 입력 검증: 옥텟 개수가 4개인지, 각 값이 0~255 사이의 유효한 숫자인지 확인하여 잘못된 입력을 걸러냅니다.
  3. 차이 누적: 각 자리 숫자의 차이에 256의 거듭제곱(자릿값)을 곱해 더하면, 두 IP를 10진수로 변환했을 때의 차이와 동일한 값이 됩니다.
  4. 절댓값 반환: Math.abs()를 사용해 입력 순서와 관계없이 항상 양의 정수를 반환합니다.

출력 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다 -

246

즉, 20.0.0.10부터 20.0.1.0 바로 앞까지의 주소는 모두 246개입니다(20.0.0.10 ~ 20.0.0.255에 해당하는 246개 주소이며, 마지막 주소인 20.0.1.0은 포함하지 않습니다).