budtree
나를 조금만 더 완성해보는 날
budtree
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 💝 Computer Science (5)
      • OS (1)
      • Network (1)
      • Database (3)
    • 🐤 study (21)
      • kubernetes🕸️ (0)
      • Spring Boot🍃 (1)
      • JPA (2)
      • Infra (2)
      • HTML | CSS (3)
      • Java (6)
      • Kotlin (3)
      • etc (4)
    • 💻 Project (3)
      • memoir & diary 📚 (1)
      • class (0)
      • project (2)
    • 🔥 Problem Solving (38)
      • programmers (30)
      • SQL (8)
      • BOJ (0)
    • ✨ daily (10)
      • diary (5)
      • exercise (5)
      • travel (0)
      • review (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 취업준비
  • 개린이
  • 코틀린
  • 프린이
  • Summer/Winter Coding
  • 피티
  • 카카오
  • 블랙멀티짐
  • ArrayList
  • 월간 코드 챌린지
  • css
  • 헬린이
  • 프로그래머스
  • 2018 KAKAO BLIND RECRUITMENT
  • HashMap
  • 코린이
  • 카카오코테
  • 코테
  • 카카오코딩테스트
  • java
  • pt
  • kotlin
  • 취업
  • programmers
  • 헬스장
  • 자바
  • 일기
  • 서울대입구 헬스장
  • 월간코드챌린지
  • 코딩테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
budtree

나를 조금만 더 완성해보는 날

[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 문자열 압축(Java)
🔥 Problem Solving/programmers

[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 문자열 압축(Java)

2022. 3. 5. 19:48

 

🔥DAY +12

 

https://programmers.co.kr/learn/courses/30/lessons/60057?language=java 

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

> 문제를 보고 싶다면 더보기 클릭!

더보기

문제 설명

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다.
간단한 예로 "aabbaccc"의 경우 "2a2ba3c"(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수 있는데, 이러한 방식은 반복되는 문자가 적은 경우 압축률이 낮다는 단점이 있습니다. 예를 들면, "abcabcdede"와 같은 문자열은 전혀 압축되지 않습니다. "어피치"는 이러한 단점을 해결하기 위해 문자열을 1개 이상의 단위로 잘라서 압축하여 더 짧은 문자열로 표현할 수 있는지 방법을 찾아보려고 합니다.

예를 들어, "ababcdcdababcdcd"의 경우 문자를 1개 단위로 자르면 전혀 압축되지 않지만, 2개 단위로 잘라서 압축한다면 "2ab2cd2ab2cd"로 표현할 수 있습니다. 다른 방법으로 8개 단위로 잘라서 압축한다면 "2ababcdcd"로 표현할 수 있으며, 이때가 가장 짧게 압축하여 표현할 수 있는 방법입니다.

다른 예로, "abcabcdede"와 같은 경우, 문자를 2개 단위로 잘라서 압축하면 "abcabc2de"가 되지만, 3개 단위로 자른다면 "2abcdede"가 되어 3개 단위가 가장 짧은 압축 방법이 됩니다. 이때 3개 단위로 자르고 마지막에 남는 문자열은 그대로 붙여주면 됩니다.

압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • s의 길이는 1 이상 1,000 이하입니다.
  • s는 알파벳 소문자로만 이루어져 있습니다.
입출력 예sresult
"aabbaccc" 7
"ababcdcdababcdcd" 9
"abcabcdede" 8
"abcabcabcabcdededededede" 14
"xababcdcdababcdcd" 17

입출력 예에 대한 설명

입출력 예 #1

문자열을 1개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #2

문자열을 8개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #3

문자열을 3개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #4

문자열을 2개 단위로 자르면 "abcabcabcabc6de" 가 됩니다.
문자열을 3개 단위로 자르면 "4abcdededededede" 가 됩니다.
문자열을 4개 단위로 자르면 "abcabcabcabc3dede" 가 됩니다.
문자열을 6개 단위로 자를 경우 "2abcabc2dedede"가 되며, 이때의 길이가 14로 가장 짧습니다.

입출력 예 #5

문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다.


 

🔥 [로직]

최적의 압축 길이를 구하는 문제이다.

한번에 압축할 문자의 수를 cut으로 놓고 for문을 이용해 값을 계속 측정하면서 최소 길이를 찾는다.

첫번째 문단에서는 cut의 수를 바탕으로 list 라는 스트링 배열을 선언해 (1)잘라진 문자열 값을 저장한다.

 

예시로 aabbaccc가 주어졌을 때, cut이 2인 경우 

list[0] = "aa"

list[1] = "bb"

list[2] = "ac"

list[3] = "cc"

의 형식으로 담는다. 

 

그리고 내부 while문을 두어 list의 값을 돌면서 (2)최솟값을 갱신해준다!

압축했을때 값이 짧아지는 경우는 값의 중복이 생겼을 경우 이기 때문에 값의 중복을 세는 변수인 dupCnt을 선언 및 초기화해준다.

또한 해당 cnt에서의 문자열 길이값(l)은 주어진 문자열 s의 길이로 초기 설정해준다.(중복이 생기지 않았을 경우에서의 최솟값이 된다.)

 

list[i]값과 list[i+1]값이 같은 경우 중복을 의미하므로 dupCnt값을 1 증가해준다.

 

dupCnt값에 따라서 l의 갱신 방법 또한 다르다.

처음으로 중복되는 경우 (dupCnt == 1), 중복되는 문자열의 앞에 숫자가 붙기 때문에 길이-cnt+1을 해줘야 한다. 

중복이 2번 이상인 경우 (dupCnt > 1), cut의 개수만큼 빼주면 되는데 여기서 고려해야 하는 추가적인 사항이 10번, 100번, 1000번과 같이 중복 카운트의 자릿수가 바뀌는 경우이다! 이럴때 각각 1씩 더해주도록 했다.

 

이렇게 해서 계산된 최종 l의 값이 기존에 누적된 최소값인 min보다 작은지를 판별하고, 작으면 min에 값을 넣어준다.

 

 

🔥 [최종 코드]

class Solution {
    public int solution(String s) {
        int length = s.length();
        int min = length;
        for(int cut = 1; cut <= (length/2); cut++) {
            String[] list = new String[length/cut];
            for(int idx = 0; idx<(length/cut); idx++) {
                if((idx+1)*cut <= length) {
                    list[idx] = s.substring(idx*cut, (idx+1)*cut);
                }
            }
            int i = 0;
            int dupCnt = 0;
            int l = length;
            while(i+1 < list.length) {
                
                if(list[i].equals(list[i+1])){
                    dupCnt++;
                    i++;
                    if(dupCnt == 1) {
                        l = l - cut + 1;
                    } else if(dupCnt > 1) {
                        l = l - cut;
                        if(dupCnt == 9) {
                            l++;
                        } else if(dupCnt == 99){
                            l++;
                        } else if(dupCnt == 999) {
                            l++;
                        }
                    }
                } else {
                    
                    dupCnt = 0;
                    i++;
                }
            }
            if(l < min) {
                min = l;
            }
            
        }
        return min;
    }
}

 

🔥 [소감]

드디어 2단계를 도전했다! 문제를 처음 보고 생각했던것보다는 난이도가 높아서 오랫동안 헤멨다. 

중복 개수의 자릿수가 바꼈을 경우의 처리를 좀 효율적이지 못하게 짠 것 같은데 달리 방법이 떠오르지 않아서 결국엔 이렇게 제출했다 ㅠㅠ

다른 사람의 풀이를 찾아봤는데.. 이번 문제가 유난히 남들의 풀이가 이해가 안가는 것 같다.

 

제대로 다시한번 보고 내가 이용할 수 있을만한 코드를 찾아서 추가해야겠다.


 

코테 준비를 본격적으로 시작한지 얼마 되지 않아 코드에 미흡한 점이 많을 수 있습니다. 
부족한 점 피드백 주시면 앞으로의 포스팅에 반영하겠습니다! 봐주셔서 정말 감사합니다 :)
-budtree

'🔥 Problem Solving > programmers' 카테고리의 다른 글

[프로그래머스] 위클리 챌린지 최소직사각형(Java)  (0) 2022.05.15
[프로그래머스] 연습문제 2016년(Java)  (0) 2022.05.15
[프로그래머스] 월간 코드 챌린지 시즌1 >두 개 뽑아서 더하기(Java)  (0) 2022.02.21
[프로그래머스] Summer/Winter Coding(~2018) > 예산 (Java)  (0) 2022.02.19
[프로그래머스] 월간 코드 챌린지 시즌1 > 3진법 뒤집기(Java)  (0) 2022.02.19
    '🔥 Problem Solving/programmers' 카테고리의 다른 글
    • [프로그래머스] 위클리 챌린지 최소직사각형(Java)
    • [프로그래머스] 연습문제 2016년(Java)
    • [프로그래머스] 월간 코드 챌린지 시즌1 >두 개 뽑아서 더하기(Java)
    • [프로그래머스] Summer/Winter Coding(~2018) > 예산 (Java)
    budtree
    budtree
    개발, 운동, 일상등의 글을 올립니다.

    티스토리툴바