👨🏫ps/🔟0️⃣백준
[백준] 3107번 IPv6 풀어보기 [Java]
peacekim
2022. 3. 10. 18:09
반응형
IPv6는 축약이 가능하다. 그래서 축약이 된 IPv6주소가 들어온다면, 축약전으로 출력을 해주는 문제이다.
문제를 풀면서 여전히 구현력이 부족하구나라는 생각이 들었고, 구현 문제를 더 많이 풀어야 겠다는 생각이 들었다.
👨🏫 풀이
입력을 :로 split을 해주었다. :로 split을 했을 때, :가 연속으로 나오고 뒤에 숫자가 있는 경우는 :: 사이를 길이가 0인 String 객체로 반환하지만, ::가 맨 뒤에 나오는 경우는 아무 것도 반환하지 않는다.
:을 split한 list의 크기(part)를 얻고, 만약 그 list안에 0인 String이 있다면, 크기에서 빼줬다.
:으로 split한 list를 하나씩 보았다. 만약, 해당 String의 길이가 0이고, part가 8보다 작다면, 0000:을 추가해주고, part를 더해주고, count도 세어주었다.
만약 part가 8인데 길이가 0인 String이 나왔다면 그냥 넘어가 줬고, 만약 String의 길이가 0이 아닌 객체가 나왔다면, 4 - 객체의 길이만큼 0을 더해주었다. 맨 끝 부분은 :을 넣으면 안되기 때문에 count한것을 바탕으로 맨끝이 아닐 경우만 :을 추가해줬다.
위에 방법으로는 맨 뒤가 ::가 나올때는 처리할 수 없기 때문에, count센 것이 8보다 작다면 0000을 추가해줬다.
👨🏻💻 코드
package 번3107;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(":");
int part = input.length;
for (String tmp : input) {
if(tmp.length() == 0) part--;
}
StringBuilder sb = new StringBuilder();
int idx = 0;
int cnt = 0;
while ( idx < input.length ) {
String tmp = input[idx];
if ( tmp.length() == 0 && part < 8){
sb.append("0000");
sb.append(":");
cnt++;
part++;
} else if ( tmp.length() == 0 ) {
idx++;
continue;
} else if ( tmp.length() != 0) {
for(int i = 0 ; i < 4 - tmp.length() ; i++){
sb.append("0");
}
sb.append(tmp);
idx++;
cnt++;
if(cnt < 8) sb.append(":");
}
}
while (cnt < 8) {
sb.append("0000");
cnt++;
if(cnt < 8) sb.append(":");
}
System.out.println(sb);
}
}
반응형