[백준]#3107 IPv6

SeungBird·2021년 4월 30일
0

⌨알고리즘(백준)

목록 보기
325/401

문제

IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.

IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.

예를 들면, 다음과 같다.

2001:0db8:85a3:0000:0000:8a2e:0370:7334

32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.

  1. 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다

2001:db8:85a3:0:00:8a2e:370:7334

  1. 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
2001:db8:85a3::8a2e:370:7334

2번째 규칙은 모호함을 방지하기 위해서 오직 한 번만 사용할 수 있다.

올바른 축약형 IPv6주소가 주어졌을 때, 이를 원래 IPv6 (32자리의 16진수)로 복원하는 프로그램을 작성하시오.

입력

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

출력

첫째 줄에, 입력으로 주어진 IPv6의 축약되지 않은 형태를 출력한다.

예제 입력 1

25:09:1985:aa:091:4846:374:bb

예제 출력 1

0025:0009:1985:00aa:0091:4846:0374:00bb

예제 입력 2

::1

예제 출력 2

0000:0000:0000:0000:0000:0000:0000:0001

풀이

이 문제는 bfs(너비 우선 탐색) 알고리즘을 이용해서 풀 수 있었다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(":");
        StringBuilder sb = new StringBuilder();

        for(int i=0; i<input.length; i++) {       //1번 조건에 해당하는 0을 채워줌
            String str = input[i];

            if(!str.equals("")) {
                while(str.length()<4){
                    str = '0'+str;
                }
                sb.append(str);
            }

            if(i!= input.length-1)
                sb.append(":");
        }

        int idx = -1;
        int flag = -1;

        for(int i=0; i<sb.length()-1; i++) {
            if(sb.charAt(i)==':' && sb.charAt(i+1)==':') {        //'::'가 존재하는 위치 찾음
                idx = i;

                if(i-1>=0 && i+2<sb.length()) {
                    flag = 0;
                }

                else if(i-1>=0) {
                    flag = 1;
                }

                else if(i+2<sb.length()) {
                    flag = 2;
                }
                sb.delete(i, i+2);
                break;
            }
        }

        if(flag!=-1) {
            while(sb.length()<38)       //해당 하는 만큼 0000을 채워줌
                sb.insert(idx, "0000:");
            sb.insert(idx, ":");


            if(flag==1) {
                sb.deleteCharAt(sb.length()-1);
            }

            else if(flag==2){
                sb.deleteCharAt(0);
            }
        }

        else {
            if(sb.length()<39) {        //'::'가 문자열 맨끝에 있는 경우
                sb.append(":");

                while(sb.length()<38)
                    sb.append("0000:");

                sb.deleteCharAt(sb.length()-1);
            }
        }

        System.out.println(sb.toString());
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글