주어진 문자열을 나누어 나누어진 문자열들이 인접한 문자열과 다르게 할 때 나누어진 문자열의 갯수를 구하는 문제이다.
문자열을 길이 1, 2로만 나누어 최대한 많이 나누게 한다. 일단 길이 1 만큼 잘라낸 후, 다음 문자열과 같으면 길이 2 만큼 자르고 다르면 1 만큼 잘라준다. 앞의 문자열의 길이가 2면 무조건 뒤의 문자열을 길이 1 만큼 잘라낸다. 마지막에 남은 문자가 이전 문자열과 같아서 독립적인 부분으로 만들 수 없다면, 이전 문자열에 이어 붙인다고 생각하고 버린다.
int n = s.length();
int ans = 0;
int i = 0;
int prevLen = 0;
char prevC1 = 0;
while (i < n) {
if (prevLen != 1 || s.charAt(i) != prevC1) {
prevLen = 1;
prevC1 = s.charAt(i);
ans++;
i++;
} else if (i + 1 < n) {
prevLen = 2;
ans++;
i += 2;
} else break;
}
sb.append(ans).append("\n");
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append('#').append(tc).append(' ');
String s = br.readLine().trim();
int n = s.length();
int ans = 0;
int i = 0;
int prevLen = 0;
char prevC1 = 0;
while (i < n) {
if (prevLen != 1 || s.charAt(i) != prevC1) {
prevLen = 1;
prevC1 = s.charAt(i);
ans++;
i++;
} else if (i + 1 < n) {
prevLen = 2;
ans++;
i += 2;
} else break;
}
sb.append(ans).append("\n");
}
br.close();
System.out.print(sb);
}
}'알고리즘(백준 등) 공부' 카테고리의 다른 글
| SWEA 12051. 프리셀 통계 (0) | 2026.05.26 |
|---|---|
| SWEA 12052. 부서진 타일 (0) | 2026.05.26 |
| SWEA 12368. 24시간 (0) | 2026.05.22 |
| SWEA 12369. 일련번호 붙이기 (0) | 2026.05.22 |
| SWEA 12741. 두 전구 (0) | 2026.05.21 |