본문 바로가기

알고리즘

[programmers] 문자열 압축


로직

1. s를 돌면서 앞에 값이랑 뒤에 값이랑 비교한다. 이때, 1~len(s)//2+1 개까지 돌리면서비교한다.

   - len(s)의 반만 돌아도 괜찮다. 어차피 최대가 ababcdcdababcdcd->2ababcdcd이기때문

2. temp라는 빈 문자열을 두고, i(1~len(s)//2+1)가 돌때마다 새롭게 만들어지는 문자열의 갯수를 비교할 것이다.

3. cnt는 같은 앞에 값이랑 뒤에 값이 같을때마다 더해주고, cnt=1일때는 그냥문자만 temp에 넣고, cnt가 1보다 크다면 cnt와 문자 둘다 넣는다

4. 그리고 나서 cnt를 다시 초기화해준다. -> aabbacc에서 2a3b로 나왔다. 이는 cnt가 제때 갱신이 되지 않아서임

5. 그리고 앞에 값을 뒤에값으로 바꿔준다. -> 앞에 값을 뒤의 값으로 바꿔줘야 그 뒤에값이랑 비교해나갈 수 있다.

6. len(s) == 1이면 ans = 1로 둔다.

 

코드

def solution(s):
    ans = 999999999999999999999999999999

    if len(s) == 1:
        return 1

    for i in range(1, len(s) // 2 + 1):  # len(s)의 반만 돌아도 괜찮다. 어차피 최대가 2s의반
        temp = ''
        cnt = 1
        front = s[:i]
        for j in range(i, len(s) + i, i):
            # 여기서 len(s)를 하면 aabbaccc에서 2a2ba까지 나오고 3c가 나오지 않음.
            # why? j가 i만큼 건너뛰면서 나타나는데 이때 끝까지 가지 못해서임
            ss = s[j:j + i]

            if front == ss:
                cnt += 1

            else:
                if cnt == 1:
                    temp += front
                else:
                    temp += str(cnt) + front
                cnt = 1  # aabbacc에서 2a3b로 나왔다. 이는 cnt가 제때 갱신이 되지 않아서임

            front = ss  # 앞에 값을 뒤의 값으로 바꿔줘야 그 뒤에값이랑 비교해나갈 수 있다.

        if ans > len(temp):
            ans = len(temp)

    # print(ans)

    return ans

 

주의할 점

1. i를 얼마나 돌려야 하나? 

   - s를 돌면서 앞에 값이랑 뒤에 값이랑 비교한다. 이때, 1~len(s)//2+1 개까지 돌리면서비교한다.

   - len(s)의 반만 돌아도 괜찮다. 어차피 최대가 ababcdcdababcdcd->2ababcdcd이기때문

 

2. 

** 문제점 : 맨 앞에 aabbacc일 때 맨 앞에 2a가 들어와야하는데 두번째 a부터 들어온다
for i in range(1, len(s) // 2 + 1):
    temp = ''
    cnt = 1
    front = s[:i]
        for j in range(i+1, len(s), i):
            ss = s[j:j+i]

** 해결책
for i in range(1, len(s) // 2 + 1):
    temp = ''
    cnt = 1
    front = s[:i]
        for j in range(i, len(s), i):
            ss = s[j:j+i]

 

3.

** 문제점 : aabbaccc에서 2a2ba까지만 나온다

for i in range(1, len(s) // 2 + 1):
    temp = ''
    cnt = 1
    front = s[:i]
        for j in range(i, len(s), i):
            ss = s[j:j+i]

 

 

** 해결책
for i in range(1, len(s) // 2 + 1):
    temp = ''
    cnt = 1
    front = s[:i]
        for j in range(i, len(s) + i, i):
            ss = s[j:j+i]

  # j i만큼 건너뛰면서 나타나는데 이때 마지막 값까지 가지 못한다. why? i가 반만 도니까!!