[백준] PS/Java [실랜디]

[백준 3107] IPv6 - JAVA

SH3542 2025. 4. 29. 02:53

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

 

문자열, 파싱 문제인데 생각보다 복잡했고 여러 방법이 있을 것 같다.

 

 

배운 점

 

String.split(regex, limit)에서,

limit를 -1로 지정해야 끝의 연속된 빈 필드까지 원소로 포함시킨다.

문제에서 가능한 입력 중, 다음과 같은 경우 차이가 일어난다.

 

 

input:

::

split(":") => [] size0의 배열

split(":", -1) => [,,] => size3의 빈 배열

 

 

이유는,

split(regex) == split(regex, 0) 이며,

limit=0일 때는 끝에서 부터 내용이 존재하지 않는 곳은 포함하지 않는 것이 기본 동작이다.

 

input:

:::a:::a::::

output: Arrays.toString(split(regex))

[, , , a, , , a] <= 빨간색 영역이 포함되지 않았음

 

파싱에서 주로 사용되는 특성상 미포함이 나은 경우가 많아서 채택 된 것이고, 이는 Perl에서 가져온 동작이라고 한다.

 

그래서, limit를

1. 음수로 지정해 포함하게 하거나

2. 빈 원소의 순번만큼 지정하거나 (위의 경우 3)

3.  Integer.MAX_VALUE처럼 충분히 높게 잡아서 해결할 수 있다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {

  public static void main(String[] args) throws IOException {

    String s = new BufferedReader(new InputStreamReader(System.in)).readLine();

    String[] split = s.split(":", -1);

    int num = 0;
    int ss = -1;
    for (int i = 0; i < split.length; i++) {
      if (split[i].isEmpty()) {
        ss = i;
      } else {
        num++;
        split[i] = String.format("%4s", split[i]).replaceAll(" ", "0");
      }
    }

    StringBuilder sb = new StringBuilder();
    String zero = "";
    for (int i = 0; i < 8 - num; i++) {
      zero += "0000";
    }

    for (int i = 0; i < split.length; i++) {
      if (i != ss) {
        sb.append(split[i]);
      } else {
        sb.append(zero);
      }
    }

    StringBuilder ans = new StringBuilder();
    for (int i = 0; i < sb.length(); i++) {

      if(i % 4 == 0) {
        ans.append(":");
      }
      ans.append(sb.charAt(i));
    }

    System.out.println(ans.substring(1));
  }
}