BOJ 3107: IPv6 https://www.acmicpc.net/problem/3107
4자리
씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분
해서 나타낸다.예시)
2001:0db8:85a3:0000:0000:8a2e:0370:7334
0의 전체 또는 일부를 생략
할 수 있다. 위의 IPv6을 축약하면, 다음과 같다.예시)
2001:db8:85a3:0:00:8a2e:370:7334
0으로만 이루어져 있는 그룹
이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)
로 바꿀 수 있다.예시)
2001:db8:85a3::8a2e:370:7334
::
로 된 부분을 :zero:
로 바꾼다.zero
부분에 1개 이상의 0000
을 넣을 것임.inputList
에 :을 기준
으로 자른 문자열 덩어리를 넣는다.resultList
에 각 덩어리의 크기가 4가 되도록 한 다음 넣는다.zero
에 들어갈 0000의 갯수
를 구한다.zero 자리
엔 0000
을 갯수에 맞춰 넣고 zero가 아닌 자리
는 resultList에 있는 값
을 그대로 넣어준다.import java.util.*;
import java.io.*;
public class Main {
static String input;
static String[] ipArr;
static String result;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine(); // 입력 받은 문자열
// "::" 로 된 부분은 "0000"이 연속으로 있는 부분이 압축 된 것
// 이 부분을 ":zero:" 이 부분으로 대체해서 나중에 "0000"을 갯수만큼 넣을 것임
if(input.contains("::")) {
input = input.replace("::", ":zero:");
}
// ipArr 배열에 ":" 를 기준으로 자른 문자열을 넣음
ipArr = input.split(":");
LinkedList<String> inputList = new LinkedList<>();
LinkedList<String> resultList = new LinkedList<>();
// 입력 받은 문자열을 넣을 List
for(int i=0; i<ipArr.length; i++) {
inputList.add(ipArr[i]);
}
// 각 자리를 4자리로 만들어 resultList에 넣음
for(int i=0; i<inputList.size(); i++) {
String str = inputList.get(i);
// "::" 가 맨 앞에 있으면 그 자리는 빈 상태가 된다
// 이 부분은 그냥 넘어감
if(str.isEmpty()) continue;
while(str.length() < 4) {
str = "0" + str;
}
resultList.add(str);
}
// 8 자리로 만듦
String[] ans = new String[8];
// "0000" 이 들어가야 할 갯수
int zeroLen = 8 - resultList.size() + 1;
int idx = 0;
for(int i=0; i<resultList.size(); i++) {
// "zero" 일 때 "0000"을 필요한 갯수 만큼 넣음
if(resultList.get(i).equals("zero")) {
while(zeroLen-- > 0) {
ans[idx] = "0000";
idx++;
}
}
// "0000" 가 아닌 값을 넣음
else {
ans[idx] = resultList.get(i);
idx++;
}
}
// 출력 형식을 만듦
String outPut = ans[0];
for(int i=1; i<ans.length; i++) {
outPut = outPut + ":" + ans[i];
}
System.out.println(outPut);
}
}
::
가 맨 앞에 왔을 때의 처리를 안해줘서 틀렸었다.