[백준] 3107: IPv6 (Java)

Yoon Uk·2022년 9월 23일
0

알고리즘 - 백준

목록 보기
67/130
post-thumbnail

문제

BOJ 3107: IPv6 https://www.acmicpc.net/problem/3107

풀이

조건

  • 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

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

      예시)
      2001:db8:85a3::8a2e:370:7334

  • 2번째 규칙은 오직 한 번만 사용할 수 있다.

풀이 순서

  • :: 로 된 부분을 :zero:로 바꾼다.
    • zero 부분에 1개 이상의 0000 을 넣을 것임.
  • inputList:을 기준으로 자른 문자열 덩어리를 넣는다.
  • resultList에 각 덩어리의 크기가 4가 되도록 한 다음 넣는다.
    • :: 가 입력받을 때 가장 앞에 있으면 inputList의 가장 앞 덩어리는 빈 덩어리가 된다.
    • 이 부분은 그냥 넘어가기 위해 비어있는지 확인하고 continue 해준다.
  • 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);
   }   
   
}  

정리

  • :: 가 맨 앞에 왔을 때의 처리를 안해줘서 틀렸었다.

0개의 댓글