어흥
[백준 3107] IPv6 (C++, Java) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/3107
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
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2026] 소풍 (C++, Java) (0) | 2022.01.16 |
---|---|
[백준 9007] 카누 선수 (C++) (0) | 2022.01.12 |
[백준 2064] IP 주소 (C++) (0) | 2021.12.29 |
[백준 14940] 쉬운 최단거리 (C++) (0) | 2021.12.26 |
[백준 19538] 루머 (C++) (0) | 2021.12.24 |
Comments