알고리즘/백준
[백준 3107] IPv6 (C++, Java)
라이언납시오
2022. 1. 4. 19:46
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/3107
3107번: IPv6
첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.
www.acmicpc.net
1. 주의할 점
- : 를 기준으로 어떻게 나눌것인가
- ::를 어떻게 처리할 것인가
2. 구현
- C++의 경우에는 sstream을 통해, Java의 경우에는 split을 통해 세미콜론을 처리했다. 다만, Java의 경우 끝에 ::가 있을 때 처리를 못해서 추가 코딩이 필요하다
- 세미콜론을 기준으로 문자열을 잘랐을 때, 해당 문자의 길이에 따라 조건을 처리하고 V 벡터 or Li 리스트에 추가한다
- 길이가 4면 그대로 추가
- 길이가 (0,4)에 속하면 앞에 0을 추가하여 길이가 4가 되도록 만든 후, 추가한다
- 길이가 0이라면, ::라는 의미이므로 -1을 추가한다
- 모든 작업이 끝난 후, 추가된 벡터/리스트의 원소를 하나씩 살피며 -1이 아니라면 그대로 다른 저장소에 추가한다
- 만약 -1이라면 전체 길이 8에서 세미콜론으로 나눠진 부분(Part)을 뺀 횟수만큼 0000을 추가한다
[C++]
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int part = 0;
string str, s;
vector<string> v, temp;
cin >> str;
istringstream ss(str);
while (getline(ss, s, ':')) {
int len = s.size();
if (len) {
part++;
if (len < 4) { //축약
while (len < 4) {
s = "0" + s;
len++;
}
}
}
else if (len == 0) s = "-1";
v.push_back(s);
}
bool add = false;
for (int i = 0; i < v.size(); i++) {
s = v[i];
if (s == "-1") {
if (!add) {
int repeat = 8 - part;
while (repeat--) {
temp.push_back("0000");
}
add = true;
}
}
else temp.push_back(s);
}
for (int i = 0; i < 8; i++) {
cout << temp[i];
if (i < 7)
cout << ":";
}
return 0;
}
[Java]
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine().trim();
String list[] = str.split(":");
List<String> li = new ArrayList<>();
List<String> temp = new ArrayList<>();
int part = 0;
for(String s : list) {
int len = s.length();
if(len>0) {
part++;
if(len<4) {
while(len<4) {
s = "0"+s;
len++;
}
}
}
else s = "-1";
li.add(s);
}
boolean add = false;
for(String ss: li) {
if(ss.equals("-1")) {
if(add) continue;
int repeat = 8-part;
while(repeat>0) {
temp.add("0000");
repeat--;
}
add=true;
}
else temp.add(ss);
}
//마지막이 ::일때 못잡기 때문
while(part<8) {
temp.add("0000");
part++;
}
for(int i=0;i<8;i++) {
System.out.print(temp.get(i));
if(i<7) System.out.print(":");
}
}
}
728x90
반응형