문제
알파벳 대문자로 이루어진 문자열을 입력받아
같은 문자가 연속으로 반복되는 경우
반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로
문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
입력
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
출력
첫 줄에 압축된 문자열을 출력한다.
예시 입력
KSTTTSEEKFKKKDJJGG
예시 출력
KST3SE2KFK3DJ2G2
출처
내 풀이
private static String compressStr1(String input) {
StringBuilder sb = new StringBuilder();
char[] chars = input.toCharArray();
// 첫 문자로 초기화
char preChar = chars[0];
int count = 1;
// 인덱스1부터(두번쨰 문자) 시작
for (int i = 1; i < chars.length; i++) {
if (preChar != chars[i]) { // 다른 문자가 나오면
sb.append(preChar); // 결과에 기존문자 추가
if (count != 1) sb.append(count); // 반복횟수가 1인 경우 생략
preChar = chars[i]; // 새 문자로 초기화
count = 1; // 1로 초기화
} else {
count++;
}
}
// 마지막 남은 압축 추가
sb.append(preChar);
if (count != 1) sb.append(count);
return sb.toString();
}
이전문자와 비교하면서 반복횟수를 저장하면서 진행
private static String archive(String str) {
StringBuilder sb = new StringBuilder();
str += " "; // 마지막 문자 비교를 위해
int count = 1;
char prev = ' ';
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (prev == ch) {
count++;
} else {
if (count != 1) sb.append(count);
sb.append(ch);
prev = ch;
count = 1;
}
}
return sb.toString();
}
다른 풀이
public String solution(String s) {
String answer = "";
s = s + " "; // 마지막 문자 비교를 위해
int cnt = 1;
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) cnt++; // 다음문자와 비교
else {
answer += s.charAt(i);
if (cnt > 1) answer += String.valueOf(cnt);
cnt = 1;
}
}
return answer;
}
다음문자와 비교, 문자열 마지막에 공백문자를 추가하여 불필요한 확인코드를 줄였다
기억할 점
문자열 문제풀 때
각 문자끼리 앞뒤로 비교할 경우, 맨 앞 문자와 마지막 문자를 주의
'Java > Coding-Test' 카테고리의 다른 글
[Java] 2-4 피보나치 수열 (0) | 2022.01.17 |
---|---|
[Java] 1-12 암호 (0) | 2022.01.16 |
[Java] 1-10 가장 짧은 문자거리 (0) | 2022.01.16 |
[Java] 1-9 숫자만 추출 (0) | 2022.01.15 |
[Java] 1-8 유효한 팰린드롬 (0) | 2022.01.15 |
댓글