점프 투 파이썬 종합문제 - 문자열 압축 질문
def compress_string(s):
    _c = "" # 인자로 받은 s 문자열중 현재 진행중인 문자를 임시저장하기위한 변수
    cnt = 0 #해당 문자가 몇 번 반복했는지 알 수 있는 카운트 변수
    result = "" #이 함수의 최종 리턴 문자열 (예: a3b2c5a1)

    for c in s:  #인자값으로 넘긴 문자열 s에서 문자 하나씩 c에 대입
        if c != _c: #현재 진행중인 문자와 c가 같지 않은 경우, 즉 새로운 문자의 시작
            _c = c # 현재 진행중인 문자와 같지 않으므로 현재진행문자는 c로 대입
            if cnt: result += str(cnt) #새로운 문자이므로 결과 문자열에 이전 문자의 카운트(있을 경우에만) 에 해당하는 값을 더해주어야함)
            result += c # 새로운 문자이므로 결과 문자열에 새로운 문자를 더함
            cnt = 1 # 새로운 문자이므로 카운트는 1로 초기화

        else: #현재 진행중인 문자와 c(이전에 저장한 문자)가 같기 때문에 카운트가 증가됨
            cnt += 1
    if cnt: result += str(cnt) # for loop를 벗어났을 때 이전 문자의 카운트는 최종적으로 한 번 더해주어야함
    return result # 최종문자열 리턴

print(compress_string("aaabbcccccca"))

주석달아주신 해석보고 이해 중인데 궁금한 점이 있습니다.

1)for loof문이 처음 돌때
for 문의 변수 c에 'a' 가 저장되고
'a'와 _c ("") 값을 비교하면 같지 않으므로 true가 되고
_c = 'a' 값을 저장하는 것 까진 이해가 됐습니다.
그 다음 중첩if 문에서 아직 cnt = 0 이므로 즉 false이고,
아래 코드(if cnt: result += str(cnt)~~ cnt =1 이 부분)가 수행되지않고

2)for loof문이 두번째로 돌면
그 때 cnt +=1 이 수행되어 결과적으로 세번째a까지 for문이 돌고나면
cnt 값은 2가 되는거 아닌가요..? 그런데 왜 a2가 아닌 a3이 출력되는지 궁금합니다..

3)if cnt: result += str(cnt) 이 부분에서 cnt 값이 0일때는 false 이므로 아래가 수행되지 않는다는 걸로 알고있는데.. 잘못이해한걸까요?

4)

제가 짠 코드인데 비효율적인 코드인지도 궁금합니다.

user_string = "ababaaccc"
user_string = list(user_string)

i=0
count = 1
while i < len(user_string)-1:
    if user_string[i] == user_string[i+1]:
        count += 1
        i += 1
    else:
        print("".join(user_string[i])+str(count),end="")
        count = 1
        i += 1

print(user_string[-1]+str(count))

user_jjang 280

M 2022년 8월 17일 7:38 오후

오...제가 만든 것과 비슷한 양이군요 도움이 되었습니다. 감사합니다. a="ababaaccc" b=a[0] cnt=1 result="" for i in a[1:]: if i==b: cnt+=1 else: result+=("{}{}".format(b,cnt)) cnt=1 b=i result+=("{}{}".format(b,cnt)) print(result) - yunh2019님, M 2022년 8월 25일 2:47 오후 추천 , 대댓글
목록으로