작성일 :

문제 링크

3035번 - 스캐너

설명

신문 기사의 각 문자를 행과 열 방향으로 확대 출력하는 문제입니다.

주어진 문서는 R × C 크기의 문자 행렬로 표현되며,

스캐너는 각 문자를 ZR × ZC 배율로 확대하여 새로 출력합니다.


즉, 원래 문서의 각 문자가:

  • 행 방향으로 ZR
  • 열 방향으로 ZC

확대되어 전체 크기가 R × ZR 행과 C × ZC 열의 행렬로 바뀌는 결과를 출력해야 합니다.


접근법

입력으로 주어지는 원본 문서의 각 문자는 그대로 유지되며,

단지 행과 열을 각각 배율만큼 복제하여 확대 출력하는 시뮬레이션 문제입니다.


이를 구현하기 위해서 다음과 같이 처리합니다:

  • 먼저 원본 문서의 각 줄을 문자열로 저장합니다.
  • 이후 전체 확대된 출력 행에 대해:
    • 인덱스를 ZR로 나눈 몫을 통해 원본 문서의 어떤 행인지 확인하고,
    • 각 열 문자 역시 ZC로 나눈 몫을 통해 원본에서 어떤 열 문자인지를 구합니다.
  • 이때 현재 확대된 위치 (i, j)는 원래 문서에서 (i / ZR, j / ZC)에 해당하는 문자를 여러 번 출력한 것이므로,
    이 좌표를 기준으로 원본 문자의 값을 가져오면 됩니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;

class Program {
  static void Main() {
    var parts = Console.ReadLine().Split();
    int r = int.Parse(parts[0]);
    int c = int.Parse(parts[1]);
    int zr = int.Parse(parts[2]);
    int zc = int.Parse(parts[3]);

    var original = new string[r];
    for (int i = 0; i < r; i++)
      original[i] = Console.ReadLine();

    for (int i = 0; i < r * zr; i++) {
      for (int j = 0; j < c * zc; j++)
        Console.Write(original[i / zr][j / zc]);
      Console.WriteLine();
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>

using namespace std;
typedef vector<string> vs;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int r, c, zr, zc; cin >> r >> c >> zr >> zc;
  vs paper(r);
  for (auto& s : paper) cin >> s;

  for (int i = 0; i < r * zr; ++i) {
    for (int j = 0; j < c * zc; ++j)
      cout << paper[i / zr][j / zc];
    cout << "\n";
  }

  return 0;
}