SWEA - 간단한 압축풀기(1946)
문제
원본 문서는 너비가 10인 여러 줄의 문자열로 이루어져 있다.
문자열은 마지막 줄을 제외하고 빈 공간 없이 알파벳으로 채워져 있고 마지막 줄은 왼쪽부터 채워져 있다.
이 문서를 압축한 문서는 알파벳과 그 알파벳의 연속된 개수로 이루어진 쌍들이 나열되어 있다. (예 : A 5 AAAAA)
압축된 문서를 입력 받아 원본 문서를 만드는 프로그램을 작성하시오.
[예제]
압축된 문서의 내용
A 10
B 7
C 5
압축을 풀었을 때 원본 문서의 내용
AAAAAAAAAA
BBBBBBBCCC
CC
[제약사항]
1. 압축된 문서의 알파벳과 숫자 쌍의 개수 N은1이상 10이하의 정수이다. (1 ≤ N ≤ 10)
2. 주어지는 알파벳 Ci는 A~Z의 대문자이다. (i는 줄의 번호로 1~N까지의 수)
3. 알파벳의 연속된 개수로 주어지는 수 Ki는 1이상 20이하의 정수이다. (1 ≤ Ki ≤ 20, i는 줄의 번호로 1~N까지의 수)
4. 원본 문서의 너비는 10으로 고정이다.
접근방식
현재 값을 받을 배열 arr와 답을 저장해놓을 ans_arr를 빈 배열로 선언
테스트 케이스의 수 만큼 j를 인수로 for문을 돌면서 변수 2개 aplha, num을 입력받고 num을 Int로 바꿔줌
그리고 num만큼 k를 인수로 for문을 돌면서 arr의 길이가 10보다 작으면 arr에 alpha를 할당
만약 10이면 new_val이라는 변수에 arr에 있는 alpha들을 join() 메서드를 통해 합쳐서 할당하고 ans_arr에 이 new_val을 append함
그리고 arr는 빈 배열로 초기화해줌
한 줄에 10개씩 문자가 나와야하므로 이렇게해주면 배열의 길이가 10개가 되면 새로운 배열에 그 값을 저장하고 현재 값을 입력받는 배열을 초기화해줌으로써 구현 가능함
그 밑에 arr.append(alpha)를 해주는 이유는 해당 조건들이 for문안에서 돌기때문인데 예를 들어서 입력으로 A 10, B 7이 들어왔으면 A를 10번 돌동안 arr에는 ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',]이 됨. 하지만 해당 조건은 len(arr) < 10일 때 충족된 조건임. 따라서 이제 B 7 이 조건이 수행되어야하는데 첫 for문에서 len(arr)가 10이므로 else 문으로 빠지게 됨. 7번만큼 for문을 돌아야하는데 else문의 조건을 수행하게 되므로 해당 수식이 없으면 k = 0일 때 B 문자를 arr에 더해주지 못함. 따라서 arr.append(alpha)를 통해 문자를 하나 더해주는 식을 적어줌
그리고 모든 for문을 다 돌고나서 arr에 남아있는 문자열들을 join() 메서드를 통해 합쳐서 remain_val에 할당해주고 이 값도 ans_arr에 append해결
코드
T = int(input())
for i in range(1, T+1):
tc = int(input())
arr = []
ans_arr = []
for j in range(tc):
alpha, num = map(str, input().split())
num = int(num)
for k in range(num):
if len(arr) < 10:
arr.append(alpha)
else:
new_val = ''.join(arr)
ans_arr.append(new_val)
arr = []
arr.append(alpha)
remain_val = ''.join(arr)
ans_arr.append(remain_val)
print("#"+str(i), *ans_arr, sep='\n')