[ baekjoon ] #3107 IPv6

eunheelog·2023년 7월 3일
0

baekjoon

목록 보기
20/20

백준 #3107 IPv6

문제


Pv6은 길이가 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
  2. 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
    2001:db8:85a3::8a2e:370:7334

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

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

💡Idea

  1. 생략된 0을 어떻게 찾을까?
    • 콜론(:)이 나오기 전까지 tmp라는 문자열에 저장해두고 길이를 비교하자
    • 길이가 4보다 작다면 4 - tmp.size() 만큼 0을 채우자 !
  2. 연속된 콜론을 어떻게 처리할까?
    • 숫자나 알파벳의 개수를 세고 8에서 뺀 값만큼 축약된 걸 알 수 있다
    • 8에서 뺀 만큼 0으로 채워주자 !

SourceCode

#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;
}

Feedback


  1. stringstream을 사용하지 않으려고 하였으나 시간이 너무 오래 걸림,,
    → stringstream으로 먼저 구현해보고 도전해보자 !
profile
⛧1일 1알고리즘⛧

0개의 댓글