👨‍🏫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);
    }
}
반응형