되면한다

백준 3107. IPv6 (문자열) 본문

코딩테스트준비

백준 3107. IPv6 (문자열)

haeullee 2023. 8. 13. 22:18

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

 

3107번: IPv6

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

www.acmicpc.net

 

1. 특징

문자열 구현

 

2. 구현 방식

1) split()함수에서 입력값을 :기준으로  벡터에 string 형태로 저장.

2001:db8:85a3::8a2e:370:7334

이 들어오면, vector<string>에는 {2001, db8, 85a3, 8a2e, 370, 7334}가 들어옴.

따라서 벡터의 사이즈는 6개 (::에 의해 생략된 묶음 2개)

*::가 들어오면 -> int idx = 3 (::앞쪽에 있는 묶음의 개수를 저장)

 

3. 코드

#include <iostream>
#include <unordered_set>
#include <vector>
#include <queue>
using namespace std;

//::이 나올때, ::앞쪽에 있는 4자리 수 묶음의 개수 
int idx; //2001:db8:85a3::8a2e:370:7334 -> idx = 3
int num; 
string str;
vector<string> _vec(8);
vector<string> split() //:기준으로 나눠서 vector에 넣기
{
    vector<string> _vector;
    string curstr = "";

    for(int i = 0; i < str.size(); i++)
    {
        if(str[i] == ':')
        {
            if(curstr == "") // ::이 나오면,
            {
                idx = num;
            }
            else // :숫자일때
            {
                _vector.push_back(curstr);
                curstr = "";
                num++;
            }
            
        }
        else
        {
            curstr += str[i];
        }
    }
    _vector.push_back(curstr);
    return _vector;
}
int main()
{           
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> str;
    _vec = split();

    int pos = 0; //::에 의해 생략된 숫자묶음
    int pos1 = 0; //숫자 묶음
    while(pos1 + pos < 8) // 숫자 묶음이 8이되면 빠져나감(0 ~ 7)
    {
        if(pos1 + pos == idx && _vec.size() != 8) // ::일때, 0000넣기(_vec.size() != 8 조건이 없으면, pos1, pos, idx = 0일때 0000출력)
        {
            for(int j = 0; j < 8 - _vec.size(); j++) // ::에의해, 생략된 숫자 묶음의 개수
            {
                cout << "0000";
                if((pos1 + pos + j) != 7) cout << ':'; 
            }
            pos = (8 - _vec.size()); // ::에 의해, 생략된 숫자 묶음의 개수
        }
        else
        {
            if(_vec[pos1].size() != 4)
            {
                int num = 4 - _vec[pos1].size();
                for(int j = 0; j < num; j++) cout << '0';
                cout << _vec[pos1];
                if(pos1 + pos != 7) cout << ':';
            }
            else
            {
                cout << _vec[pos1];
                if(pos1 + pos != 7) cout << ':';
            }
            pos1++;
        }
        
    }
    
}
Comments