PS/백준

백준 / 구현 / 16967번 / 배열 복원하기 / JS

KimMinJun 2023. 12. 7. 20:33

< 문제 바로가기 >

 

16967번: 배열 복원하기

크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐

www.acmicpc.net

 

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(filePath).toString().split('\n');

/**
 * H: A의 세로, W: A의 가로, X: 밑으로 움직인 칸 수, Y: 오른쪽으로 움직인 칸 수
 */
const [H, W, X, Y] = input.shift().split(' ').map(Number);
const A = Array.from({ length: H }, () => Array.from({ length: W }));
const B = input.map(row => row.split(' ').map(Number));

const solution = () => {
  // 겹친부분에 더해진 만큼 빼준다.
  // 밑으로 X, 오른쪽으로 Y만큼 움직여서 겹친부분을 더해줬기 때문에,
  // 위로 X, 왼쪽으로 Y만큼 갔을 때 있는 요소만큼 빼주면 원래 값이 나온다.
  for(let i=X; i<H; i++) {
    for(let j=Y; j<W; j++) {
      B[i][j] -= B[i-X][j-Y];
    }
  }

  // A의 크기에 맞는 만큼 B를 복사한다.
  for(let i=0; i<H; i++) {
    for(let j=0; j<W; j++) {
      A[i][j] = B[i][j];
    }
  }

  A.forEach((row) => {
    console.log(row.join(' '));
  });
};

solution();