되면한다
백준 3107. IPv6 (문자열) 본문
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++;
}
}
}
'코딩테스트준비' 카테고리의 다른 글
백준 1916. 최소비용 구하기 (다익스트라) (0) | 2023.08.15 |
---|---|
백준 1238. 파티 (다익스트라) (0) | 2023.08.14 |
백준 1991. 트리 순회(전위, 중위, 후위 순회) (0) | 2023.07.31 |
백준 11725. 트리의 부모 찾기 (트리 bfs, dfs) (0) | 2023.07.31 |
백준 1043. 거짓말 (그래프) (0) | 2023.07.31 |
Comments