String(문자열) - 11. 문자열 압축

2023. 8. 19. 04:34·알고리즘/String(문자열)

1. 문제

같은 문자가 반복되는 경우 반복되는 문자 오른쪽에 반복 횟수를 표기하고 압축

반복횟수가 1이면 생략

 

2 - 1. 나의 풀이

1. i번째와 i + 1 번째를 비교한다.

2. 같다면 count 변수를 +1 한다. (count = 1로 초기화되어있음)

3. 다르다면 다른 문자라는 뜻이므로 count를 answer에 추가한다.

4. 다를 때 count = 1이면 그냥 넘어간다. count를 다시 1로 초기화한다. (반복횟수가 1이라는 뜻이므로)

 

ArrayIndexOutOfBoundsException가 계속 나서 고민하다가 char[] 을 초기화할 때 기존의 크기 + 1 로 선언했다.

i와 i + 1번째를 비교하므로 맨 마지막 요소까지 반복문이 실행되면 ArrayIndexOutOfBoundsException가 터질 가능성이 있으므로 배열의 크기를 1 늘려서 이를 방지한다.

 

 

2 - 2. 나의 코드

import java.util.Arrays;
import java.util.Scanner;

public class String11  {
    public static String solution(String str) {
        String answer = "";
        char[] chArr = new char[str.length() + 1];
        char[] chArr1 = str.toCharArray();
        for (int i = 0; i < chArr1.length; i++) {
            chArr[i] = chArr1[i];
        }
        int count = 1;

        for (int i = 0; i < chArr.length -1; i++) {
            if (chArr[i] == chArr[i + 1]) {
                count++;
            } else {
                answer += chArr[i];
                if(count == 1) continue;
                answer += count;
                count=1;
            }
        }
        return answer;
    }

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

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

    }
}

 

3 - 1. 강의 풀이

나의 풀이와 같다.

하지만 나는 String을 char[]로 바꾼 다음 비교했다.

 

강의에서는 굳이 char[]로 바꾸지 않고 str.charAt()을 사용해 비교했다.

이게 더 효율적이다.

 

그리고 강의에서 int형 변수 count를 String 참조 타입 answer에 추가하기 위해서

answer += String.valueOf(count)를 사용했다.

 

3 - 2. 강의 코드

import java.util.Scanner;

public class String11_solution {
    public static String solution(String str) {
        String answer = "";
        //반복문에서 i와 i+1을 비교하므로 맨 마지막 인덱스에서 오류가 발생할 수 있으므로 빈공간을 추가해줌.
        str = str + " ";

        int count=1;
        for (int i = 0; i < str.length() - 1; i++) {
            if(str.charAt(i) == str.charAt(i+1))count++;
            else{
                answer += str.charAt(i);
                if(count==1) continue;
                //answer += String.valueOf(count);
                answer += count;
                count=1;
            }
        }
        return answer;
    }

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

4. 얻어갈 점

1. 배열의 인덱스 요소에 대해 반복문을 실행할 때 ArrayIndexOutOfBoundsException을 조심하자.

2. int형 변수를 String 변수에 추가할 때 String.valueOf() 또는 Integer.toString()을 사용하자.

 

'알고리즘 > String(문자열)' 카테고리의 다른 글

백준 1213번 팰린드롬 만들기  (0) 2025.05.07
String(문자열) - 12. 암호  (0) 2023.08.23
String(문자열) - 10. 가장 짧은 문자거리  (0) 2023.08.07
String(문자열) - 9. 숫자만 추출  (0) 2023.07.29
String(문자열) - 8. 유효한 팰린드롬  (1) 2023.07.24
'알고리즘/String(문자열)' 카테고리의 다른 글
  • 백준 1213번 팰린드롬 만들기
  • String(문자열) - 12. 암호
  • String(문자열) - 10. 가장 짧은 문자거리
  • String(문자열) - 9. 숫자만 추출
koreaioi
koreaioi
  • koreaioi
    koreaioi
    koreaioi
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (162) N
      • JAVA (3)
      • 알고리즘 (88)
        • 백준 (11)
        • String(문자열) (12)
        • Array(1, 2차원 배열) (13)
        • Two pointers, Sliding windo.. (6)
        • HashMap, TreeSet(해쉬, 정렬지원 S.. (5)
        • Stack, Queue(자료구조) (8)
        • Sorting and Searching(정렬, 이.. (10)
        • Recursive, Tree, Graph(DFS,.. (14)
        • DFS, BFS 활용 (6)
        • 다시 시작! (1)
        • 기초 수학 (1)
      • 일상 (22)
      • Github (1)
      • MSA 공부 (4)
      • 경제, 금융, 디지털, 시사 (3)
      • 라즈베리파이 (10)
      • 프로젝트에서 일어난 일 (18)
      • FrontEnd 공부 (9)
        • React (8)
      • Spring (2)
      • 기술 세미나 (1)
      • DB (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
koreaioi
String(문자열) - 11. 문자열 압축
상단으로

티스토리툴바