알고리즘/백준 BOJ

[백준] 3035: 스캐너 (Python)

한비 2023. 8. 19. 13:11

스캐너

 

3035번: 스캐너

첫째 줄에 R, C, ZR, ZC가 주어진다. R과 C는 1과 50 사이의 정수이고, ZR과 ZC는 1과 5 사이의 정수이다. 다음 R개 줄에는 신문 기사가 주어진다.

www.acmicpc.net

 

문제

상근이는 매일 아침 영자 신문을 학교에 가져와서 읽는다. 하지만, 상근이의 눈은 점점 나빠졌고, 더 이상 아침 신문을 읽을 수 없는 상황에 이르렀다. 상근이는 스캐너를 이용해서 글자를 확대한 다음에 보려고 한다.

신문 기사는 글자로 이루어진 R*C 행렬로 나타낼 수 있다. 글자는 알파벳과 숫자, 그리고 마침표로 이루어져 있다.

스캐너는 ZR과 ZC를 입력으로 받는다. 이렇게 되면, 스캐너는 11크기였던 각 문자를 ZRZC크기로 확대해서 출력해 준다.

신문 기사와 ZR, ZC가 주어졌을 때, 스캐너의 스캔을 거친 결과를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 R, C, ZR, ZC가 주어진다. R과 C는 1과 50 사이의 정수이고, ZR과 ZC는 1과 5 사이의 정수이다.

다음 R개 줄에는 신문 기사가 주어진다.

 

출력

스캐너에 스캔된 결과를 총 RZR개 줄에 걸쳐서 CZC개 문자씩 출력한다.

 

입출력 예제

입력 출력
3 3 1 2
.x.
x.x
.x.
..xx..
xx..xx
..xx..
3 3 2 1
.x.
x.x
.x.
.x.
.x.
x.x
x.x
.x.
.x.

 

풀이

ZC가 커지면 줄마다 각 문자를 ZC번 반복하면 된다. for문으로 각 줄에 있는 각 문자를 순회하면서 *ZC 연산을 한다.

ZR이 커지면 각 줄의 내용을 ZR번 반복하면 된다. 위에서 만든 한 줄의 문자열을 ZR번 print 한다.

str은 item assignment (동적 할당)를 허용하지 않으므로 입력 받은 문자열 중간을 수정할 수는 없다. 따라서 결과를 저장할 별도의 문자열 ans를 만든다.

만약 확장한 결과를 하나로 리턴해야 한다면 ans를 리스트 형태로 관리하고, zr번 print하는 대신 해당 줄에 해당하는 ans를 zr번 append한다.

import sys
input = sys.stdin.readline
r, c, zr, zc = map(int, input().split())
arr = [input().rstrip() for _ in range(r)]
for i in range(r):
	ans = ''
	for j in range(c):
		ans += arr[i][j] * zc
	for j in range(zr):
		print(ans)

메모리: 31256 KB / 시간: 40 ms

시간 복잡도: O(rc) - r개의 줄에 대해 c개의 문자만큼 연산을 반복해야 함 (zr보다 c의 범위가 훨씬 크므로 rc라고 표기함)

공간 복잡도: O(c) - ans의 최대 길이는 c*zc (zc는 1~5 범위의 상수이므로)