문제
유니는 압축된 문자열을 갖고 있다.
압축된 문자열이란 어떤 문자열에서 연속된 문자가 존재하면 그 문자들을 연속 등장 횟수와 해당 문자 하나로 바꿔서 만든 문자열을 말한다.
예를들어 원본 문자열이 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()
'알고리즘' 카테고리의 다른 글
[알고리즘 문제] tobin (Python / 파이썬) (0) | 2022.05.12 |
---|---|
[알고리즘 문제] 직사각형 완성하기 (Python / 파이썬) (0) | 2022.05.11 |
[알고리즘 문제] 해싱2 (Python / 파이썬) (0) | 2022.05.11 |
[알고리즘 문제] 369 (Python / 파이썬) (0) | 2022.05.11 |
[알고리즘 문제] division (Python / 파이썬) (0) | 2022.05.11 |
댓글