카페 바자르 IP 데이터베이스

시간 제한2초메모리 제한512 MB

요약
IPv5 주소 범위를 CIDR 또는 시작-끝 형식으로 최대 100개 입력받아, 같은 주소 집합을 덮는 최소 개수의 서로 겹치지 않는 CIDR 블록으로 변환해 출력한다.
난이도

보통10점 중 7점

유형
구현, 그리디, 정렬, 비트 연산
정답자
아직 제출이 없습니다

문제

카페 바자르는 서버 부하가 커서 성능 최적화와 통계 목적으로 서버 트래픽을 날마다 기록한다. 하루치 로그에 담긴 IP 주소는 아래에 설명하는 두 형식, 곧 IP 구간 형식이나 CIDR 형식 중 하나로 데이터베이스에 저장한다.

IP 데이터베이스 소프트웨어는 IPv5라고 부르는 새 인터넷 프로토콜(IP)을 쓴다. IPv5는 주소 비트 수를 IPv4의 32비트에서 40비트로 늘려 더 많은 주소를 제공한다. IPv5의 IP 주소는 인터넷에 연결된 장치마다 붙는 40비트 수치 라벨이다. 주소 하나는 바이트라고 부르는 수 5개의 나열로 나타내며, 각 바이트는 0부터 255까지의 십진값을 가진다. IP 주소는 보통 점 십진 표기법으로 쓴다. 예를 들어 "134.172.16.254.1"과 같이 다섯 바이트를 십진수로 적고 마침표로 구분한다. 이 표기법에서 앞의 0 바이트는 생략하지 않는다. 예를 들어 수치값이 0인 주소는 "0.0.0.0.0"으로 적는다.

CIDR(Classless Inter-Domain Routing)은 IP 주소의 범위를 지정하는 방법이다. CIDR은 보통의 IP 주소 뒤에 빗금과 수 하나를 붙인 모양이다. CIDR y/xy/x에서 yy는 IP 주소이고 xx는 0 이상 40 이하의 정수이며, 왼쪽 xx개 비트가 yy의 왼쪽 xx개 비트와 같은 주소 전체의 범위를 뜻한다. 나머지 비트는 0이어도 되고 1이어도 된다. 범위마다 표현을 하나로 정하려고 yy의 오른쪽 40−x40 - x개 비트는 모두 0이어야 한다.

IP 구간 형식은 IP 주소의 범위를 지정하는 또 다른 방법이다. 이 형식의 범위는 첫 주소와 마지막 주소를 점 십진 표기법으로 적고 붙임표(-)로 이어서 나타낸다. IP 주소를 256진법 다섯 자리 수로 볼 때 첫 주소는 마지막 주소보다 크지 않다.

예를 들어 "128.192.168.200.0/32"는 앞 32비트(4바이트 "128.192.168.200")가 범위 안의 모든 주소에서 같고 마지막 바이트만 달라지는 CIDR이다. 같은 범위를 IP 구간 형식으로 쓰면 "128.192.168.200.0-128.192.168.200.255"이다.

세계 곳곳에서 고객이 모이고 여러 해 동안 서비스를 이어 온 탓에 IP 데이터베이스는 점점 커지고 있다. 그래서 카페 바자르는 이미 저장된 범위를 최소 개수의 CIDR로 나타내어 데이터베이스의 항목 수를 줄이려고 한다. 새로 만든 CIDR은 데이터베이스에 속하지 않는 IP 주소를 하나도 포함해서는 안 된다. 이 두 조건을 만족하는 CIDR 집합은 하나뿐이다.

입력

입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 IP 데이터베이스에 들어 있는 IP 범위의 개수 nn이 주어진다(1≤n≤1001 \le n \le 100). 이어지는 nn개 줄에는 IP 범위가 한 줄에 하나씩 CIDR 형식이나 IP 구간 형식으로 주어진다. 입력의 마지막 줄에는 0이 주어지며 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다 IP 데이터베이스 전체를 나타내는 CIDR의 최소 개수를 한 줄에 출력하고, 이어서 그 CIDR을 IP 값이 커지는 순서로 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    2
    128.192.168.10.0/32
    128.192.168.11.0-128.192.168.11.255
    1
    128.192.168.200.0-128.192.168.200.10
    0
    
    예상 출력
    1
    128.192.168.10.0/31
    3
    128.192.168.200.0/37
    128.192.168.200.8/39
    128.192.168.200.10/40
    
  2. 예제 2

    입력
    1
    0.0.0.0.0-255.255.255.255.255
    0
    
    예상 출력
    1
    0.0.0.0.0/0