티스토리 뷰

 

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

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

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는 알파벳 소문자로만 이루어져 있다

 

 

문제풀이

 

문제 설명의 예시와 같이 문자를 단위를 정해두고 제일 앞부터 정해진 길이만큼 잘라야 한다.
답이 될 수 있는 길이 중 최댓값은 문자열의 길이이다.

압축한 문자열 중 가장 짧은 것을 찾기 위해 1부터 문자열 길이 - 1까지를 단위로 설정해서 문자열을 잘라본다.

 

 

"abcabcdede"를 3개 단위로 압축하는 과정을 살펴보자.

 

 

먼저 문자열의 0부터 2까지를 now에 저장해둔다.

동일한 문자열이 반복되는 횟수를 저장하는 cnt는 1로 초기화한다.

다음 부분 문자열을 tmp, 압축된 문자열을 저장하는 변수를 result라고 하겠다.

 

 

노란색 박스가  now , 보라색 박스가  tmp 이다.

 

 

now와 tmp가 같은 문자열이므로 cnt를 증가시킨 후에 다음 문자로 넘어간다.

현재 result는 비어있는 상태다.

 

 

now와 tmp가 같은 문자열이 아니므로 result에 now를 더해준다.

cnt가 2 이상일 때는 result에 now를 더하기 전에 숫자를 먼저 더한다.

현재 result는 "2abc"이고 now를 tmp인 "ded"로, cnt를 1로 세팅해준다.

 

 

 

now와 tmp가 같은 문자열이 아니므로 result에 now를 더해준다.

현재 result는 "2abcded"이고 now는 tmp인 "e"로, cnt는 1로 바꿔준다.

이 다음은 문자열의 길이를 넘어가기 때문에 반복문을 종료한다.

 

 

마지막으로 남은 문자열 now를 result에 더해준 후에 문자열 압축을 종료한다.

최종 result는 "2abcdede"가 된다.

 

 

코드

 

C++ 코드

 

 

Kotlin 코드

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함