Notice
Recent Posts
Recent Comments
Link
04-27 09:56
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

<<개발일지>>

[문자열] 11. 문자열 압축 본문

코딩테스트

[문자열] 11. 문자열 압축

개발하는지호 2023. 12. 7. 07:06
11. 문자열 압축
 

설명

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는

문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.

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

입력

첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.

출력

첫 줄에 압축된 문자열을 출력한다.

예시 입력 1 

KKHSSSSSSSE

예시 출력 1

K2HS7E

예시 입력 2 

KSTTTSEEKFKKKDJJGG

예시 출력 2

KST3SE2KFK3DJ2G2

 

 

 

<<풀이>>

 

-> 일단 나의 풀이이다.

 

import java.util.Scanner;

class Main {

    public String solution(String str) {
        int count = 1;
        String answer = "";
        for (int i = 0; i < str.length() - 1; i++) {

            if (str.charAt(i) == str.charAt(i + 1)) {
                count++;

            } else {

                if (count == 1) {
                    answer += str.charAt(i);
                } else {
                    answer += str.charAt(i);
                    answer += count;
                }
                if (str.charAt(i + 1) == str.charAt(str.length()-1)) {
                    answer += str.charAt(i + 1);
                    if (count > 1) {
                        answer += count;
                    }
                }


                count = 1;
            }


        }
        return  answer;
    }




    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();

        System.out.println(T.solution(str));
    }
}

 

 

이렇게 하면 제시한 예시의 입력값에 출력값은 맞다. 하지만 채점 사이트에서는 오답으로 나온다 ㅋㅋ ㅠ 솔직히 나도 이 문제를 풀면서 처음에는 구조적으로 움직였지만 뒤에는 중간에 추가하고 빼고 넣고 이렇게 했어서 다시 풀어라고 하면 무조건 막힌다.

 

 

근데!!

 

import java.util.Scanner;

class Main {

    public String solution(String str) {
        int count = 1;
        String strr = str + " ";
        String answer = "";
        for (int i = 0; i < strr.length() - 1; i++) {

            if (strr.charAt(i) == strr.charAt(i + 1)) {
                count++;
                if (i == strr.length()-2) {
                    answer += strr.charAt(i);
                    answer += count;
                }

            } else {

                if (count == 1) {
                    answer += strr.charAt(i);
                } else {
                    answer += strr.charAt(i);
                    answer += count;
                }

                count = 1;
            }


        }
        return  answer;
    }




    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();

        System.out.println(T.solution(str));
    }
}

 

살짝 힌트를 들은 후 푼 문제 ! 바로 정답이다 ㅎㅎ

 

핵심은 원래 str값에 " "를 더해주는 것이다. 그렇다면 내가 처음에 구상했던 방식이 작동한다. 두 번째 풀이가 원래 내가 구상한거였고 첫번째 풀이가 구상한 것에서 마구마구 변형된 형태이다.

 

<<선생님 풀이>>

 

import java.util.Scanner;

class Main {
    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 T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();

        System.out.println(T.solution(str));
    }
}

 

심플하고 코드가 깔끔하다 ㅋㅋ 나는 cnt가 1일 때와 >1일 때 이렇게 나눠서 했는데 선생님 풀이는 한 줄 안에 끝내 버렸다.

처음 부터 이렇게 깔끔하게 적는다는 건 힘들다. 천천히 차근차근 논리적인 생각을 하는 연습을 한다면, 계속해서 좋아지고 성장할 것이다.

 

<<추가 공부>>

String.valueOf(int) -> 정수값을 문자열로 바꿔준다.  이 외에도 문자 배열을 합쳐 문자열로 반환시켜주기도 한다.

 

'코딩테스트' 카테고리의 다른 글

[배열] 1. 큰 수 출력하기  (1) 2023.12.08
[문자열] 12. 암호  (1) 2023.12.07
[문자열] 10.가장 짧은 문자거리  (1) 2023.12.03
[문자열] 9. 숫자만 추출  (2) 2023.12.03
[문자열] 8. 유요한 팰린드롬  (1) 2023.12.03