본문 바로가기
알고리즘

백준 IPv6 , 3107번

by kcj3054 2021. 11. 19.

문제

https://www.acmicpc.net/problem/3107

풀이

힘들었다.
로직을 몇개로 나눌 수 있었다.

  1. 처음에는 비어있지 않은 구역의 수를 헤아리는 것이다. 총구역의 수는 8개이다.

  2. 빈 구역의 수를 저장한 후 다음 로직에서 ::이 보이면 빈구역만틈 0000을 넣는다.

  3. i번째에서 :말고 다른 것들이 나오게된다면 tmp나 임시변수에 쌓으면서 :가 보일때 넣는다

  4. 주의할점은 i가 s.size() -1 즉 끝부분에 다달았을 경우에는 다음번에 :가 보이지 않으니 바로 합체(makeArea부분)를 해준다

소스

#include <bits/stdc++.h>

using namespace std;

string s, tmp, ans;
int areaCnt;

void doubleZero() {
    for (int i = 0; i < 8 - areaCnt; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            ans.push_back('0');
        }
        if (ans.size() != 39) ans.push_back(':');
    }
}

void makeArea() {
    for (int i = 0; i < 4 - tmp.size(); i++)
    {
        ans += '0';
    }

    ans += tmp;
    tmp = "";
}
int main() {

    cin >> s;

    //빈 구역 헤아리기 
    bool Ok = false;
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] != ':' && !Ok) {
            areaCnt++;
            Ok = true;
        } 
        else if (s[i] == ':') {
            Ok = false;
        }
    }

    if (s[0] != ':') tmp = s[0];

    for (int i = 1; i < s.size(); i++)
    {
        if (s[i] != ':') {
            tmp += s[i];

            //마지막부분에 왔을때는 모았던  tmp다 써버리기 
            if (i == (int)s.size() - 1) {
                makeArea();
            }
        }

        if (s[i] == ':') {
            if (s[i - 1] == ':') {
                doubleZero();
            }
            else
            {
                //지금까지 모았던 tmp정보들 ans에 넣기 넣고 tmp초기화  
                makeArea();
                if (ans.size() != 39) ans += ':';
            }
        }
    }
    cout << ans;

    return 0;
}