bit가 눈 앞에서 왔다갔다

Py ) 프로그래머스 60057 + 1/16다시풀기 본문

Algorithm/Prob

Py ) 프로그래머스 60057 + 1/16다시풀기

헬린인형 2022. 1. 10. 17:43

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

 

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

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

programmers.co.kr

어디서 본 거 같다고 생각했는데 나동빈씨 책에 있는 문제였다.

예전에 봤을 때 안풀고 넘겼었나봄. 푼 흔적이 없다.

나동빈씨는 똑똑하다.

def solution(s):
    answer = len(s)
    candi = ""

    for i in range(1, len(s) // 2 + 1):     # 토큰의 길이 설정
        front = s[0:i]
        cnt = 1
        for j in range(i, len(s), i):
            if front == s[j:j+i]:           # 그 다음과 같을 경우
                cnt += 1
            else:                           # 같지 않음, 비교 끝
                if cnt >= 2:                # 중복의 경우가 2 이상
                  candi += str(cnt) + front     # 숫자와 함께 넣어줌
                else:
                    candi += front
                front = s[j:j+i]    # 그 다음 토큰
                cnt = 1
        if cnt >= 2:
            candi += str(cnt) + front
        else:
            candi += front

        answer = min(len(candi), answer)
    return answer

 

틀렸지만 + 파이썬을 잘 몰라서 제대로 못풀었지만 열심히 했으니까 내 꺼도 올리기,,,

'''
2 이상 중복의 경우 숫자로 표현, 1은 숫자 없음
2개 단위로 자르기
문자열 압축한 것 중 가장 짧은 것의 길이 return
'''
"""
for i in range(len(문자열))
정해진 길이만큼 잘라야한다.
문자열 mod i == 0인 경우만 가능

[0:i]로 잘라서 list에 넣기
다 list.append()해서 넣고, 

list 맨 앞 원소 기준으로 바로 뒤 원소가 같으면 세어주면서 삭제
같은게 있었다면, tmp += 해당 원소 길이 + 1
같은게 없었다면 tmp += 해당원소 길이
이후 candi.append(tmp)
tmp = 0

각 문자 요소가 뒤에 있는지 없는지 판단?
"""

from collections import deque
def solution(s):
    answer = 0
    sliced=deque([])
    candi = []
# 0~14
# 1로 한바퀴 다 돌고 그 다음 바퀴 돌도록
    for i in range(len(s)):
        copy = list(s)
        if i == 0 or len(s) % i != 0:
            continue
        while copy:
            check = copy[:i]
            if i == 1:          # 뒤에 같은 문자가 없으면 종료
                if check not in s:
                    answer = len(s)
                    return answer
            sliced.append(copy[:i])     # i만큼 자른 거 list에 넣기
            copy.lstrip(copy[:i])       # 어떻게 하는거지..?
    tmp = 0
    front = sliced.popleft()
    while sliced:
        second = sliced.popleft()
        n = len(front)
        if front == second:      # 앞뒤 원소가 같다면,
            n += 1
        tmp += n
        front = second
    candi.append(tmp)

    answer = min(candi)
    return answer

문자열에서 일정 코큰만큼 지워버리고 싶었는데

방법을 못찾았다. list로 했다면 어떻게 했을거 같긴한데, 이미 진이 빠져버린 상태였다. 힘들었음,, 그래서 그냥 답 보기로..

화이팅 나 자신... (뚀륵,,

 

+ 다시 풀기 - 성공)

def solution(s):
    answer = len(s)
    cnt = 1
    comp =[]
    for i in range(1, len(s)//2+1):
        first = s[0:i]
        for j in range(i, len(s)+1, i):
            if first == s[j:j+i]:
                cnt += 1
            else:
                if cnt > 1:
                    comp += str(cnt)+first
                else: comp += first
                cnt = 1
            first = s[j:j+i]
        comp += s[j:]

        answer = min(answer, len(comp))
        comp.clear()

    return answer

 

반응형

'Algorithm > Prob' 카테고리의 다른 글

Py) 프로그래머스 42862  (0) 2022.01.12
Py) 프로그래머스 42627  (0) 2022.01.12
Py) 프로그래머스 42584  (0) 2022.01.07
Py) 프로그래머스 42587  (0) 2022.01.07
Py) 프로그래머스 43165  (0) 2022.01.05
Comments