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));
}
}
'[백준] PS > Java [실랜디]' 카테고리의 다른 글
[백준 2346] 풍선 터뜨리기 - JAVA (0) | 2025.04.30 |
---|---|
[백준 2811] 상범이의 우울 (0) | 2025.04.29 |
[백준 2597] 줄자접기 - JAVA (0) | 2025.04.28 |
[백준 2548] 대표 자연수 - JAVA (0) | 2025.04.28 |
[백준 2713] 규현이의 사랑을 담은 문자메시지 - JAVA (1) | 2025.04.28 |