Pv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.
IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.
예를 들면, 다음과 같다.
2001:0db8:85a3:0000:0000:8a2e:0370:7334
32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.
2번째 규칙은 모호함을 방지하기 위해서 오직 한 번만 사용할 수 있다.
올바른 축약형 IPv6주소가 주어졌을 때, 이를 원래 IPv6 (32자리의 16진수)로 복원하는 프로그램을 작성하시오.
#include <iostream> #include <string> using namespace std; // zero 채우기 string make_zero(int cnt) { string tmp = ""; for(int i=0; i<cnt; i++) { tmp += "0000:"; } return tmp; } int main() { string input, result = "", tmp = ""; cin >> input; int cnt = 0; // 연속된 콜론 처리하기 for(int i=0; i<input.size(); i++) { if(input[i] == ':') { if(tmp != "") cnt++; tmp = ""; } else { tmp += input[i]; if(i == input.size() - 1) cnt++; } } string clone; if(cnt < 8) { clone = make_zero(8 - cnt); } int idx = input.find("::"); if(idx != string::npos) { if(idx != 0) { clone = ":" + clone; } input.replace(input.find("::"), 2, clone); if(input[input.size() - 1] == ':') { input = input.substr(0, input.size() - 1); } } tmp = ""; // 생략된 0 추가하기 for(int i=0; i<input.size(); i++) { if(input[i] == ':') { if(tmp.length() < 4) { result += string(4 - tmp.length(), '0'); } result += tmp + ":"; tmp = ""; } else tmp += input[i]; } // 마지막 그룹 처리해주기 if(tmp.length() < 4 && !tmp.empty()) { result += string(4 - tmp.length(), '0'); } result += tmp; cout << result; return 0; }