728x90
문자열 압축
설명
알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
입력
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
출력
첫 줄에 압축된 문자열을 출력한다.
예시 입력 1
KKHSSSSSSSE
예시 출력 1
K2HS7E
예시 입력2
KSTTTSEEKFKKKDJJGG
예시 출력2
KST3SE2KFK3DJ2G2
풀이
내가 푼 방법은 다음과 같다.
0. 정답으로 리턴할 문자열 변수인 answer를 선언한다. StringBuilder도 생성한다.
1. 입력받은 문자열을 문자 배열로 바꾼다. 현재 위치의 문자가 몇 번 나왔는지 카운팅하는 정수형 변수 count를 1로 초기화한다.
2. 이전 문자를 저장하는 변수인 문자형 변수 previousChar에 배열의 0번째 요소를 할당한다.
3. 0번째 요소를 StringBuilder에 추가한다.
4. i는 1부터 문자열의 길이만큼 다음 로직을 반복한다.
- 이전 문자와 현재 문자가 같다면
- count를 1 증가시킨다.
- count가 3 이상이라면 StringBuilder의 마지막 인덱스에 있는 글자를 삭제한다.
- count를 StringBuilder에 추가한다.
- count를 1 증가시킨다.
- 이전 문자와 현재 문자가 다르다면
- 현재 문자(arr[i])를 이전 문자(previousChar)로 저장한다.
- count 변수를 1로 초기화한다.
- 현재 문자(arr[i])를 StringBuilder에 추가한다.
5. (반복문 끝) StringBuilder로 String으로 바꾸고 정답을 리턴한다.
강의에서 설명해준 풀이 방법은 다음과 같다.
0. 정답으로 리턴할 문자열 변수인 answer를 선언한다.
1. 입력받은 문자열에 빈 문자를 하나 넣는다. 마지막 인덱스에서 오류가 나는 것을 방지하기 위함이다.
2. 문자의 반복 횟수를 세는 정수형 변수 cnt를 1로 초기화한다.
3. i가 0부터 문자열의 길이-1 일 때 까지 다음 로직을 반복한다.
- 문자열의 i번째 문자와 문자열의 i+1번째 문자를 비교해서 같다면 cnt를 1 증가시킨다.
- 같지 않다면 answer 변수에 i번째 문자를 더한다.
- 만약 cnt가 1 이상이라면 cnt를 String으로 바꾸어 answer에 더한다.
- cnt를 1로 초기화한다.
4. 정답을 리턴한다.
코드
내가 푼 방법
package solve;
import java.util.Scanner;
public class Main_1_11_my {
public String solution(String s) {
String answer = "";
StringBuilder answerBuilder = new StringBuilder();
char [] arr = s.toCharArray(); // 입력받은 문자열을 문자 배열로 바꾸기
int count = 1; // 해당 문자 몇 번 나왔는지 세는 변수
char previousChar = arr[0]; // 이전 문자를 저장하는 변수, 초기에는 0번째 문자 저장
answerBuilder.append(previousChar); // 0번째 문자를 추가
for(int i = 1; i < s.length(); i++) {
if(previousChar == arr[i]) { // 이전 문자와 현재 문자가 같다면
count++; // 증가
if(count >= 3) { // 3 이상이면
answerBuilder.deleteCharAt(answerBuilder.length()-1); // 마지막 인덱스 지우고
}
answerBuilder.append(count); // 추가
} else { // 이전 문자와 현재 문자가 다르다면
previousChar = arr[i]; // 현재 문자를 이전 문자로 저장
count = 1; // 1로 다시 설정
answerBuilder.append(arr[i]); // 현재 문자 추가
}
}
answer = answerBuilder.toString();
return answer;
}
public static void main(String[] args) {
Main_1_11_my T = new Main_1_11_my();
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println(T.solution(str));
}
}
강의에서 설명한 방법
package solve;
import java.util.Scanner;
public class Main_1_11 {
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;
}
public static void main(String[] args) {
Main_1_11 T = new Main_1_11();
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println(T.solution(str));
}
}
728x90
'Coding Test Inflearn' 카테고리의 다른 글
[Greedy Algorithm] 씨름선수 (0) | 2024.03.18 |
---|---|
[String] 암호 (2) | 2024.02.03 |
[String] 가장 짧은 문자거리 (2) | 2024.01.30 |
[String] 숫자만 추출 (2) | 2024.01.29 |
[String] 유효한 팰린드롬 (0) | 2024.01.28 |