Skip to content

Commit 79c3dc3

Browse files
committed
[Silver III] Title: 배열 복원하기, Time: 208 ms, Memory: 20480 KB -BaekjoonHub
1 parent 97b95ac commit 79c3dc3

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# [Silver III] 배열 복원하기 - 16967
2+
3+
[문제 링크](https://www.acmicpc.net/problem/16967)
4+
5+
### 성능 요약
6+
7+
메모리: 20480 KB, 시간: 208 ms
8+
9+
### 분류
10+
11+
구현
12+
13+
### 제출 일자
14+
15+
2026년 2월 28일 15:49:27
16+
17+
### 문제 설명
18+
19+
<p>크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐진다.</p>
20+
21+
<p>즉, 배열 B의 (i, j)에 들어있는 값은 아래 3개 중 하나이다.</p>
22+
23+
<ul>
24+
<li>(i, j)가 두 배열 모두에 포함되지 않으면, B<sub>i,j</sub> = 0이다.</li>
25+
<li>(i, j)가 두 배열 모두에 포함되면, B<sub>i,j</sub> = A<sub>i,j</sub> + A<sub>i-X,j-Y</sub>이다.</li>
26+
<li>(i, j)가 두 배열 중 하나에 포함되면, B<sub>i,j</sub> = A<sub>i,j</sub> 또는 A<sub>i-X,j-Y</sub>이다.</li>
27+
</ul>
28+
29+
<p>배열 B와 정수 X, Y가 주어졌을 때, 배열 A를 구해보자.</p>
30+
31+
### 입력
32+
33+
<p>첫째 줄에 네 정수 H, W, X, Y가 주어진다. 둘째 줄부터 H + X개의 줄에 배열 B의 원소가 주어진다.</p>
34+
35+
<p>항상 배열 A가 존재하는 경우만 입력으로 주어진다.</p>
36+
37+
### 출력
38+
39+
<p>총 H개의 줄에 배열 A의 원소를 출력한다.</p>
40+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"use strict";
2+
3+
const fs = require("fs");
4+
const input = fs
5+
.readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
6+
.toString()
7+
.trim()
8+
.split("\n");
9+
10+
/**
11+
* A 배열: 크기가 H x W
12+
* 정수 X, Y
13+
*
14+
* B 베열: 크기가 (H+X) * (W+Y)
15+
* => 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있음
16+
* 수가 겹쳐지면 수가 합쳐짐
17+
*
18+
* 1. (i,j)가 두 배열 모두에 포함 x: B[i][j]=0
19+
* 2. (i,j)가 두 배열 모두에 포함: B[i][j] = A[i][j] + A[i-X][j-Y]
20+
* 3. (i,j)가 두 배열 중 하나에 포함: B[i][j] = A[i][j] || A[i-X][j-Y]
21+
*
22+
* 만약 i<X, j<Y인 곳은 B[i][j]가 곧 A[i][j]와 동일한 것 (안겹치는 구간이니깐)
23+
* 2에서 식을 정리하면 A[i][j] = B[i][j] - A[i-X][j-Y]인데
24+
* A[i-X][j-Y]=B[i-X][j-Y]이므로 결국 B[i][j] = B[i][j] - B[i-X][j-Y]가 됨
25+
*/
26+
27+
let line = 0;
28+
const [H, W, X, Y] = input[line++].split(" ").map(Number);
29+
const B = [];
30+
31+
for (let i = 1; i <= H + X; i++) {
32+
B.push(input[i].split(" ").map(Number));
33+
}
34+
35+
for (let i = 0; i < H; i++) {
36+
for (let j = 0; j < W; j++) {
37+
if (i >= X && j >= Y) {
38+
B[i][j] -= B[i - X][j - Y];
39+
}
40+
}
41+
}
42+
43+
for (let i = 0; i < H; i++) {
44+
console.log(B[i].slice(0, W).join(" "));
45+
}

0 commit comments

Comments
 (0)