알파벳 대문자로 이루어진 문자열을 받아 연속적으로 반복된 단어는 문자 표시후 오른쪽에 수를 표시한다.
입력 예제
AABCCCCCDDE
출력 예제
A2BC5D2E
💡 나의 풀이 과정
이 문제를 처음 봤을 때 문자열을 문자 배열에 나눠서 검사하면 되겠다고 생각했다
같은 문자인 경우에 카운팅을 따로 해주고 다른 문자인 경우에 문자와 숫자를 저장하면 된다고 생각했다.
1. 문자열을 받고 나서 그냥 대문자로 변경해줬다(원래는 대문자로 받는 문제다)
2. 문자열을 문자 배열에 담아준다.
3. 반복된 문자를 카운팅 해줄 int 변수(cnt)와 그전에 나왔던 문자가 무엇인지 확인 하도록 문자 변수(temp)도 선언했다.
4. 반복문 내의 첫번째 조건문은 첫번째 문자일 경우에 temp변수에 저장했다
🔍이렇게 다른 조건을 준 이유는 처음 추가된 문자의 경우 cnt를 따로 저장하지 않아야 하기 때문이다.
5. 다음 조건은 그전에 나온 문자(temp)와 문자배열(a[i])의 값이 다른 경우에 cnt를 먼저 저장하고 문자를 저장해준다.
그리고 cnt를 1로 초기화 시켜준다.(새로운 문자가 나온거니까 다시 1부터 cnt 를 세줘야 한다.)
🔍 이때 cnt 가 1이 아닐때만 저장하라는 조건문을 걸었는데 출력 예제를 보면 문자 하나의 경우 숫자를 넣지 않았다.
6. 맨 처음 시작도 아니고 temp 와 arr[i]도 같지않은 상황에서 마지막 문자가 연속된 경우에도 cnt를 저장해줘야 한다.
🔍 이 부분이 없으면 마지막 부분이 연속된 숫자 일 때 cnt 를 저장할 구간이 없다.
7. 맨 처음 시작도 아니고 temp 와 arr[i]도 같지않으면 즉 그 전에 나온 문자(temp) 와 다음문자(arr[i])가 같은경우이다.
🔍 이때는 cnt를 1씩 더해주면 된다.
중간 중간 오류가 나서 수정을 많이 했더니 생각보다 복잡한 코드가 된듯하다.😥
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public String solution(String str) {
String answer = "";
str = str.toUpperCase();
char[] a = str.toCharArray();
int cnt = 1;
char temp = '#';
String save = "";
for (int i = 0; i < str.length(); i++) {
if (temp == '#') {
temp = a[i];
save += String.valueOf(a[i]);
} else if (temp != a[i]) {
temp = a[i];
if (cnt != 1) {
save +=cnt;
}
save += String.valueOf(a[i]);
cnt = 1;
} else if(i==str.length()-1) {
cnt++;
save+=cnt;
}else {
cnt++;
}
}
answer = save;
return answer;
}
public static void main(String args[]) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(T.solution(str));
}
}
💡 강사님 풀이 과정
강사님은 i 라는 index로 각 문자 배열을 탐색하려고 하셨음
🔨내 풀이와의 차이
강사님은 toCharArray로 비교가 아닌 charAt을 통해 비교하셨음.
마지막 부분에 강사님은 빈 문자를 하나 추가해 줘서 이 알고리즘이 모든 문장에 통하도록 했다.
강사님은 인덱스 값이 i 와 i+1 의 위치의 문자를 비교했기 때문에 뒤에 빈문자를 추가해주고
for 문 같은 경우에는 i<str.length()-1 범위 까지만 반복해 주면 됐다.
모든 str 에 마지막에 빈 문자를 추가해 주면 따로 cnt 를 저장하는 수고를 거치지 않아도 된다.
이번 문제는 강사님 풀이랑 위에 풀었던 방식이랑 거의 비슷한거 같아서
따로 설명을 추가 하지 않겠습니다.
코테 관련해서 많이 부담스러웠는데 강의를 통해 푸는 방법들을 배우니 이 시간이 즐겁습니다.
진짜 기능하나하나 다양한 방법으로 잘 가르쳐주십니다.
출처 : 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 대시보드 - 인프런 | 강의 (inflearn.com)
'알고리즘 > Java 코딩 테스트 준비' 카테고리의 다른 글
[Java] 큰 수 출력하기. (0) | 2023.01.31 |
---|---|
[Java] 아스키코드 비밀 암호 해독하기 (0) | 2023.01.30 |
[Java] 특정 문자와 가장 짧은 거리 배열로 출력하기 (0) | 2023.01.28 |
[Java] 문자와 숫자가 섞여있는 문자열 중 숫자만 추출해라 (0) | 2023.01.27 |
[Java] 앞뒤로 읽을 때 같은 문자(특수 문자 제거 후 읽기=>정규식 활용) (0) | 2023.01.25 |
댓글