사용 언어 : 파이썬 문제: 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다. QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다. ( 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. )
제출
1차 > repeat = int(input()) # 케이스 개수를 받고, total = [] for i in range(repeat): key = input().split() # key에 케이스를 숫자, 문자열로 나누어 리스트로 받아서 key[0] = int(key[0]) # 숫자를 정수형으로 해주어 total.append({key[0]:key[1]}) # total에 숫자:문자열 형태로 리스트에 넣는다. for i in range(repeat): a = list(total[i]) # total에서 숫자만을 빼오고, b = list(total[i].values()) # 또 문자열도 빼와서 b_list = list(b[0]) # 문자열을 리스트화 시켜서 하나하나 나누어 a_num = a[0] result = [] for i in b_list: result.append(i*a_num) # result라는 리스트에 문자열의 요소를 숫자만큼 반복한 것들을 넣는다. str_ = ''.join(result) # result의 요소들을 모두 공백없이 합쳐서 print(str_) # 프린트한다.
:: 만들고 나니 제대로 동작은 하지만 비효율적인듯 하여 고쳐보았다.
2차 > repeat = int(input()) num = [] word = [] for i in range(repeat): key, value = input().split() # 굳이 리스트로 받아서 딕셔너리로 만들 필요가 없는듯 하여 # 각자 숫자를 key, 문자열을 value로 받는다. num.append(int(key)) # num이라는 리스트에 받은 숫자들을 넣고, word.append(value) # 문자열은 word에 넣는다. for i in range(repeat): letters = list(word[i]) # word에서 문자열을 하나씩 빼와 리스트화 시켜서 letters에 넣는다. number = num[i] str_ = [] for i in letters: multiple = i*number # 문자열의 글자를 숫자만큼 반복한 것을 str_.append(multiple) # str_ 에 넣고 result = ''.join(str_) # 그것들을 모두 공백없이 합쳐서 print(result) # 프린트 해준다.
:: 처음보다 코드의 수는 줄었지만, 아직도 너무 길다.
:: 다른 분들의 코드를 보고 참고하여 좀더 고쳐보았다.3차 > repeat = int(input()) num = [] word = [] for i in range(repeat): key, value = input().split() # 2차와 마찬가지로 받은 입력값을 각자 바로 key와 value에 할당, for i in value: # 리스트로 만들지 않고 바로 for문으로 가져와서 multiple = i*int(key) # 글자 하나하나를 빼와 숫자만큼 반복한 뒤, print(multiple, end='') # 프린트하고 뒤에 end=''를 붙여 공백없이 다음의 반복되는 글자가 출력 되도록 한다. print() # 다른 케이스의 결과가 다음 줄에 출력되도록 빈 프린트를 하나 넣어준다.
:: 좀더 둘러보던 중 좋은 코드를 발견하여 링크 첨부.
:: https://pacific-ocean.tistory.com/41
:: 참고할 정의 -> 할당연산자