백준 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);
    }
}

총평

난이도

⭐★★★★

후기

개선할 점