백준 16967 - 배열 복원하기
Updated:
Java
16967 번 - 배열 복원하기
문제
크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐진다.
즉, 배열 B의 (i, j)에 들어있는 값은 아래 3개 중 하나이다.
- (i, j)가 두 배열 모두에 포함되지 않으면, Bi,j = 0이다.
- (i, j)가 두 배열 모두에 포함되면, Bi,j = Ai,j + Ai-X,j-Y이다.
- (i, j)가 두 배열 중 하나에 포함되면, Bi,j = Ai,j 또는 Ai-X,j-Y이다. 배열 B와 정수 X, Y가 주어졌을 때, 배열 A를 구해보자.
접근 방법
겹친 부분이 있는 Ai,j 는 결국 Ai,j + Ai-X,j-Y이므로
Ai,j에서 Ai-X,j-Y을 빼준다.
여기서 자기 원본을 스스로 차를 구하여 수정해 주어야 한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int h,w,x,y;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
h = stoi(stk.nextToken());
w = stoi(stk.nextToken());
y = stoi(stk.nextToken());
x = stoi(stk.nextToken());
arr = new int[h + y][w + x];
for(int i = 0; i < h + y; i++) {
stk = new StringTokenizer(br.readLine());
for(int j = 0; j < w + x; j++) {
arr[i][j] = stoi(stk.nextToken());
}
}
for(int i = 0; i < h ; i++) {
for(int j = 0; j < w; j++) {
// y, x 이상의 인덱스 부터 A 배열이 겹치므로, 그 차이를 구한다.
if(i >= y && j >= x) {
arr[i][j] -= arr[i - y][j - x];
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
sb.append(arr[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb.toString());
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
난이도
⭐★★★★
후기
없
개선할 점
없