Namu | 나무 개발자 블로그입니다


[KAKAO2020][01] 문자열 다루기 by namu

post image
image by tech.kakao.com


들어가며

2020 신입 개발자 블라인드 1차 1번 문제의 해설이다.
정답률은 25.9% 이며 문자열 다루는 능력에 대해 테스트하는 비교적 쉬운 난이도이다(라고 한다ㅠ).


Question

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

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

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

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


Answer

일단 파이썬으로 풀어보았다.

  1. 문자열의 제일 앞부터 순차적으로 단위를 증가시키면서 분해 > 분해 최대단위는 문자열 길이의 절반 혹은 /2 의 내림수.
  2. 각 분해 단위 결과값의 길이를 저장, 가장 짧은 경우를 반환한다.
  3. 제한사항을 지킬 것.


출제 의도

문자열을 다룰 수 있고, 아래 예시와 같이 문자열과 관련된 다양한 작업을 할 수 있는지 파악


문제 풀이

첫 번째로 배치된, 가장 쉬운 문제입니다. 문자열 길이가 최대 1,000으로 제한이 크지 않기 때문에, 가능한 모든 방법을 탐색하면 됩니다. 문자열 길이가 N일 때, 길이가 N/2 보다 크게 잘랐을 때는 길이가 줄지 않습니다. 따라서 1 ~ N/2 길이로 자르는 방법을 모두 탐색한 후 그중 가장 짧은 방법을 선택하면 됩니다.


후기

(성능 신경x)가능한 모든 방법을 탐색하면 된다는 점에서 그리디 유형 문제라고 판단된다.
일단 나는 제시된 문제 풀이 아이디어를 잘 캐치했다. 문자열을 다룰 수 있는지에 대한 부분과, 문자열 길이 N에 대해 그 절반 길이 이하까지만 divide 하면 된다는 아이디어를 캐치함.

풀이상 핵심은,

  1. N//2 단위까지 문자열 분할하여 리스트로 저장
  2. 리스트 저장 시 comprehension 활용여부 -> [s[idx:idx+count] for idx in range(0, len(s), count)]
  3. 연속된 문자열단위마다 counting 하기, 문자열 비교, 길이 도출 등등..

이정도?