2020 KAKAO BLIND RECRUITMENT 문자열 압축 파이썬

1 분 소요

2020 KAKAO BLIND RECRUITMENT 문자열 압축 파이썬 풀이

‘이것이 코딩테스트다’ A09번 문제이고, 프로그래머스에서 직접 테스트해야 하는 문제입니다.
개인적으로 30분 정도 풀다가 해결책을 찾지 못하고, 교재에 나온 모범답안과 다른 사람들의 풀이를 참고하면서
어려웠던 부분에 대한 공부를 했습니다.

어려웠던 부분

  1. 가장 코드로 구현하기 까다로웠던 부분은, 문자열을 특정 단위별로 끊었을 때,
  2. 그 간격만큼 이동시켜주는 것이었습니다.
  3. 간격(step)은 전체 길이를 2로 나눈 몫까지만 해당한다는 것은 알고 있었지만,
  4. step만큼 지정한 단어와 바로 뒤에 이어 오는 단어를 비교할 수 있는 for 문을 구현하기가 어려웠습니다.

이를 해결하기 위해서 step은 1부터 전체 문자열 길이를 2로 나눈 몫까지 진행하고, 비교를 위한 2중 for문에서는 for j in range(step, len(s), step) 으로 표현할 수 있었습니다.
이렇게 한다면, step만큼 이동하면서 비교가 가능합니다. 최종적으로, 새롭게 만들어진 문자열인 compressed의 길이를 min 함수로 갱신해주면 답을 구할 수 있습니다.

def solution(s):
    answer = len(s)
    # 1개 단위(step)부터 압축 단위를 늘려가며 확인
    for step in range(1, len(s)//2 +1):
        compressed = ""
        prev = s[0:step] # 앞에서부터 step만큼의 문자 추출
        cnt = 1
        # 단위(step) 크기만큼 증가시키며 이전 문자열과 비교
        for j in range(step, len(s), step):
            # 이전 상태와 동일하다면 압축 횟수(cnt)증가
            if prev == s[j:j+step]:
                cnt += 1
            # 다른 문자열이 나왔다면(더 이상 압축하지 못하는 경우라면)
            else:
                compressed += str(cnt) + prev if cnt >= 2 else prev
                prev = s[j:j+step] # 상태 초기화
                cnt = 1
        # 남아 있는 문자열에 대해서 처리
        compressed += str(cnt) + prev if cnt >= 2 else prev
        # 만들어지는 압축 문자열이 가장 짧은 것이 정답
        answer = min(answer, len(compressed))
    return answer

해당 문제는 2020년도 카카오 신입공채 코딩 테스트 중 한 문제이고,

프로그래머스에서 난이도 2인 문제입니다.

2중 for문을 효율적으로 활용하는 능력이 많이 부족하다고 느꼈고,

index를 적절하게 옮기면서 비교하는 문제가 많기 때문에 꼭 기억하고 넘어가야 할 것 같습니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady

댓글남기기