<aside> 💬 lv1, 문자열 처리, 압축

문자열 간단한 압축

문제 설명

주어진 문자열에서 연속적으로 반복되는 문자를 압축하여 표현하는 코드를 작성해주세요. 예를 들어, "aaabbccccdaa" 문자열은 "a3b2c4d1a2"로 압축됩니다. 각 문자 뒤에는 해당 문자가 연속으로 나타난 횟수를 표시합니다.


제한 사항


입출력 예

입력 (문자열) 출력 (압축된 문자열)
"aaabbccccdaa" "a3b2c4d1a2"
"abcd" "a1b1c1d1"
"eeeeeee" "e7"

입출력 설명

문자열에서 연속적으로 반복되는 문자를 찾아, 그 문자와 반복 횟수를 함께 표현합니다. 예를 들어, "abcd"는 각 문자가 1번씩 나타나므로 "a1b1c1d1"로 압축됩니다.

</aside>

풀이 1. 반복문과 인덱스 활용

def solution(data):
    text = data[0] **#1 변수 설정 및 데이터 처리 준비**
    compressed = []
    count = 1

    for i in range(1, len(text)): **#2 문자열 처리**
        if text[i] == text[i - 1]:
            count += 1
        else:
            compressed.append(text[i - 1] + str(count))
            count = 1
    compressed.append(text[-1] + str(count)) **#3 마지막 문자 처리**

    return "".join(compressed) **#4 최종**

단계별 풀이 전략

  1. 변수 설정 및 데이터 처리 준비

    text = data[0] 입력된 리스트 data의 첫 번째 요소를 text변수에 할당합니다.

    이렇게 해주는 이유는 pyalgo 에서 매개변수 data 에 문자열이 바로 오지 않고, 리스트의 형태로 전달되어서 문자열로 다시 만들어 주기 위한 변수 설정입니다.

    compressed = [] → 압축된 문자열을 저장할 빈 리스트를 초기화합니다.

    count = 1 → 현재 검사 중인 문자가 반복되는 횟수를 세는 변수입니다. 첫 문자부터 검사를 시작하므로 초기 값은 1입니다.

  2. 문자열 처리

    1. 반복문으로 문자열의 두 번째 문자부터 마지막 문자까지 반복하여 검사합니다.
    2. 현재 문자가 이전 문자와 같은 경우, count1 증가 시킵니다. text[i - 1] 구문 때문에 두 번째 문자부터 for문을 반복하는 것이 필요했습니다.
    3. 만약 현재 문자가 이전 문자와 다른 경우, compressed.append(text[i - 1] + str(count)) → 이전에 반복되던 문자와 그 횟수를 문자열로 만들어 compressed 리스트에 추가합니다.
    4. count = 1 → 반복 횟수를 다시 1로 초기화합니다. 새로운 문자의 반복 횟수를 세기 위함입니다.
  3. 마지막 문자 처리

    반복문이 끝난 후, 마지막 문자와 그 반복 횟수를 처리합니다. for문의 조건을 벗어나면 if-else문을 실행하지 못하기 때문에 그 시점까지 문자와 카운트 된 숫자를 한번 더 더해줘야 합니다.

  4. 최종

    compressed 리스트에 저장된 문자열들을 연결하여 최종 문자열을 만들고 반환합니다.

알아 둬야 할 개념

문자열 자체를 순회하면서 비교하기 위해서는 for문을 어떻게 구성 하는 지가 중요합니다. 인덱스에 사용할 값을 위해 for문을 사용할 때 가장 조심해야 하는 것이 인덱스 오류입니다.

기존대로 0번째 인덱스부터 비교를 하면 인덱스 오류가 나기 쉽습니다.

for i in range(1, len(text)):
    if text[i] == text[i - 1]:
        count += 1
    else:
        compressed.append(text[i - 1] + str(count))
        count = 1

for i in range(1, len(text)) 에서 for문을 0 이 아니라 1에서 시작해야 합니다.

if text[i] == text[i - 1] 다음과 같은 if문을 사용할 때 0부터 시작하면 text[0] == text[-1] 이라 인덱스 오류가 납니다.

풀이 2. count 함수 활용

def solution(data):
    data = data[0] **#1 변수 설정 및 데이터 처리 준비**
    curr = [data[0]]
    ret = ""
    for s in data[1:]: **#2 문자열 처리**
        if s not in curr:
            ret += str(curr[0]) + str(curr.count(curr[0]))
            curr = []
        curr.append(s)
    ret += str(curr[0]) + str(curr.count(curr[0])) **#3 마지막 문자 처리**
    return ret **#4 최종**

단계별 풀이 전략

  1. 변수 설정 및 데이터 처리 준비

    입력된 리스트 data의 첫 번째 요소를 data변수에 할당합니다. 이렇게 해주는 이유는 pyalgo 에서 매개변수 data 에 문자열이 바로 오지 않고, 리스트의 형태로 전달되어서 문자열로 다시 만들어 주기 위한 변수 설정입니다.

    curr = [data[0]] → 문자열의 첫 번째 값을 리스트 curr 에 넣어줍니다. 항상 같은 문자열이 더해지는 리스트입니다.

    ret = "" → 반환할 결과 값을 저장할 문자열 변수 입니다.

  2. 문자열 처리

    1. 반복문을 통해 문자열의 두 번째 문자부터 마지막 문자까지 반복하여 검사합니다.

      if s not in curr → 변수 설정에서 해줬던 리스트 curr 안에 첫 번째 인덱스 문자 s가 포함이 안되어 있다면 if문 안을 실행합니다.

    2. ret += str(curr[0]) + str(curr.count(curr[0]))if문 안으로 들어왔다면 같은 문자의 반복이 끝났다는 의미입니다.

    3. 반환할 결과 문자열 변수 ret 안에 curr 의 0번째 인덱스의 문자, 반복이 끝난 문자를 더해주고, 리스트 currcurr 0번째 인덱스의 문자의 수를 체크해서 더해줍니다.

      어차피 같은 문자들만 curr 로 들어오기 때문에 str(len(curr)) 해줘도 되지만 더 확실한 체크를 위해 리스트 안에 해당 문자의 수를 세줍니다.

    4. 리스트 curr 의 역할은 끝났으니 curr = [] 로 초기화 해줍니다.

    5. curr.append(s) if문 안을 실행했다면curr은 빈 리스트이고, if문 안을 실행하지 않았다면 그 문자는 curr 리스트에 더해집니다.