본문 바로가기

알고리즘

[프로그래머스] 문자열 압축 - 파이썬

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

해당 문제는 입력받은 문자열의 절반만큼의 수로 문자열을 잘라서 비교하는 문제입니다.

 

1. for문으로 1,2,... len(s) // 2 +1 까지 자를 수를 정한다.

2. stack을 사용하여 해당 자를 수가되면 비교를한다

3 현재 자른 결과를 answer와 비교하여 최소값을 찾는다

 

def solution(s):
    answer = 1001
    # 1개가 들어올 경우 1 return
    if len(s) == 1:
        return 1
    
    # s의 길이의 절반까지 나눈 압축의 최소값을 구한다.
    for i in range(1,len(s) // 2 + 1):
        stack = []
        cnt = 1
        now_result = ""
        cur_word = ""
        # i로 현재에서 나눈 단어를 비교해본다
        for word in range(len(s)):
            # 현재 단어를 더해준다
            cur_word += s[word]
                
            
            # 만약 cur_word가 i와 같으면 아래단계진행
            if len(cur_word) == i:
            # 아직 아무 단어도 저장 안되어있다면
                if len(stack) == 0:
                    stack.append(cur_word)
                    cur_word = ""
                # 바로 전의 단어가 저장되어 있다면
                else:
                    # 바로전의 단어와 같다면 cnt를 올려준다
                    if stack[0] == cur_word:
                        cnt += 1
                        cur_word = ""
                    # 바로 전의 단어와 다르면 전의단어를 now_result에 저장
                    # 그 후 현재의 단어를 stack에 저장
                    else:
                        prev_word = stack.pop()
                        if cnt == 1:
                            now_result += prev_word
                        else:   
                            now_result += str(cnt) + prev_word
                            cnt = 1
                        stack.append(cur_word)
                        cur_word = ""
        if cnt != 1:
            now_result += str(cnt) + stack.pop()
        else:
            now_result += stack.pop()
        now_result += cur_word
        answer = min(len(now_result), answer)
    
    return answer

 

해당 반복문의 마지막을 처리하는것이 관건이였습니다.

그래서 해당 마지막 처리하는 로직을 추가해주고 반복할때마다 answer와 비교하여 최소값을 찾았습니다.