본문 바로가기
알고리즘

[알고리즘 문제] 문자열 압축2 (Python / 파이썬)

by yewonnie 2022. 5. 11.

문제

유니는 압축된 문자열을 갖고 있다.
압축된 문자열이란 어떤 문자열에서 연속된 문자가 존재하면 그 문자들을 연속 등장 횟수와 해당 문자 하나로 바꿔서 만든 문자열을 말한다.
예를들어 원본 문자열이 AAABBBBBCAA였다면 3A5BC2A로 압축된다. 이는 A가 세 번 등장한 후 B가 다섯 번 등장하고, C가 한 번 A가 두 번 등장함을 의미한다. 여기서 C처럼 연속으로 한 번만 등장한 문자는 1을 적지 않는다.
압축된 문자열이 주어질 때 원본 문자열을 출력하는 프로그램을 작성하시오.
원본 문자열에서 10번 이상 연속으로 등장하는 문자는 없다는 것이 보장된다.

입력

첫째 줄에 테스트케이스의 수 T가 주어진다..
각 테스트케이스의 첫 줄에 압축된 문자열이 주어진다. 압축된 문자열의 길이는 2,000 이하다.
( 1 ≤ T ≤ 10 )

출력

각 테스트케이스마다 '#'과 테스트케이스의 번호, 공백을 출력한 뒤 원본 문자열을 출력한다.

문제 풀이

압축 된 문자열을 다시 원상복구 하는 문제입니다. 

이 문제는 두 가지 case로 나누어 생각해야 합니다.

1. 압축 된 문자가 1개 이상인 경우

2. 압축 된 문자가 1개인 경우

압축 된 문자가 1개인 경우는 앞에 숫자가 존재하지 않습니다.

압축 된 문자가 1개 이상인 경우는 숫자가 존재합니다.

 

따라서, 이 두 가지 케이스에 따라 생각해보면

만약 숫자일 경우, 그 다음 인덱스에는 문자가 있을 것이므로 

해당 숫자만큼 문자를 출력해주고 

인덱스를 2 증가시켜줍니다. 

만약 문자일 경우, 그 문자를 출력해주고 

인덱스를 1 증가시켜줍니다.

 

그 이유는, 숫자일 경우 그 다음은 무조건 문자일 것이므로 2칸을 넘어가주는 것이고

문자일 경우 문자 하나만 존재하는 것이므로 1칸만 넘어가 줍니다.

 

이 과정을 반복해주면 압축된 문자열을 원상복구 할 수 있습니다.


My Code

for tc in range(int(input())):
    s = input() # 압축 된 문자열

    print('#', str(tc + 1), end = ' ')

    index = 0
    while index != len(s): # index가 범위 안일 때만 수행
        if s[index].isalpha(): # 알파벳이라면
            print(s[index], end = '') # 해당 알파벳 출력
            index += 1 # 1칸만 이동
        else: # 숫자라면
            print(int(s[index]) * s[index + 1], end = '') # 숫자만큼 그 다음 인덱스의 알파벳 출력
            index += 2 # 2칸 이동
    
    print()

 

댓글