Post

String_문자열 압축

✅ 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기

단 반복횟수가 1인 경우 생략합니다.

맨 마지막 인덱스가 없으면 에러나니까 미리 str에 빈 문자를 맨 마지막에 추가해두고 시작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Main {
    public String solution(String str) {
        String answer= "";
        str = str + " "; //맨 뒤에 문자 하나 추가해두기
        int p=1;
        for(int i=0; i<str.length(); i++) {
            char c = str.charAt(i);
            char n = str.charAt(i+1);

            if (c == n) {
                p++;
            } else if(c != n){
                answer += c;
                if (p != 1) {
                    answer += p;
                    p = 1;
                }

            }


        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String str= sc.next();
        System.out.print(T.solution(str));
    }

}


//⭐️input:
// KKHSSSSSSSE
//⭐️output:
//K2HS7E

//⭐️input:
// KSTTTSEEKFKKKDJJGG
//⭐️output:
//KST3SE2KFK3DJ2G2

🟢 맨 마지막 인덱스보다 작니 ? 작아서 값 있으면 : 값 없으면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Main {
    public String solution(String str) {
        String answer= "";
        char[] charArr= str.toCharArray();
        int p=1;
        for(int i=0; i<charArr.length; i++) {
            char c = charArr[i];
            char n = (i < charArr.length - 1) ? charArr[i + 1] : '0';

            if (c == n) {
                p++;
            } else if(c != n){
                answer += c;
                if (p != 1) {
                    answer += p;
                    p = 1;
                }
            }
        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String str= sc.next();
        System.out.print(T.solution(str));
    }

}

  1. int p = 1로 둔다.
  2. 이제 array를 돌면서 지금 인덱스와 다음 인덱스에 있는 알파벳을 비교할 것이다.
  3. 그런데 맨 마지막 인덱스에 다다르면 존재하지 않는 인덱스와 비교해야 한다. 이를 해결하는 방법은 두 가지가 있다.
    ⭐️ 3-1. array 돌기 전에 str의 맨 마지막에 빈 문자를 하나 추가해두기
    ⭐️ 3-2. 맨 마지막 인덱스보다 작니? 그러면 원래대로 다음 인덱스랑 비교 : 아니면 빈 문자 아무거나
  4. 비교 후 같으면 p++
  5. 지금, 그 다음 인덱스끼리 비교 후 같지 않으면 정답 String에다가 지금 알파벳을 추가하고, p에다가 몇 번 나왔는지 누적해놓았으니 p도 추가한다.
  6. 그런데 p가 1인 경우 추가하지 말라고 했으니 p가 1이면 추가하지 않는다는 if문
  7. 그리고 p는 다시 1로 초기화

🔵 ThingsILearned

✔️ 배열에서 없는 값을 비교하게 되면 에러 뜨는데요?

  • 미리 배열 맨 마지막에 의미 없는 아무 값을 추가해두거나
  • 배열 맨 마지막에 다다랐을 때 없다면 ~게 해라 라는 조건문을 ?를 사용해서 간단하게 짜둔다.

✔️ 굳이 charArray로 바꾸어야 할까? 잘 생각해보자.

This post is licensed under CC BY 4.0 by the author.