알고리즘/PS - 백준

[백준 16967 - Java] 배열 복원하기

excited-hyun 2021. 10. 7. 16:30
반응형

https://www.acmicpc.net/problem/16967

 

16967번: 배열 복원하기

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

www.acmicpc.net

 

문제

크기가 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를 구해보자.

입력

첫째 줄에 네 정수 H, W, X, Y가 주어진다. 둘째 줄부터 H + X개의 줄에 배열 B의 원소가 주어진다.

항상 배열 A가 존재하는 경우만 입력으로 주어진다.

출력

총 H개의 줄에 배열 A의 원소를 출력한다.

제한

  • 2 ≤ H, W ≤ 300
  • 1 ≤ X < H
  • 1 ≤ Y < W
  • 0 ≤ Bi,j ≤ 1,000

 

풀이

이 문제는 배열을 그려서 겹치는 곳과 안겹치는 곳의 패턴을 파악하면 쉽게 풀리는 문제입니다!!

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int A, B, X, Y;
		
		A = sc.nextInt();
		B = sc.nextInt();
		X = sc.nextInt();
		Y = sc.nextInt();
		
		int[][] arrA = new int[A][B];
		int[][] arrB = new int[A+X][B+Y];
		
		for(int i=0; i<A+X; i++) {
			for(int j=0; j<B+Y; j++) {
				arrB[i][j] = sc.nextInt();
			}
		}
		
		//겹치지않는 왼쪽 위 부분 
		for(int i=0; i<X; i++) {
			for(int j = 0; j<B; j++) {
				arrA[i][j] = arrB[i][j];
			}
		}
		for(int i=X; i<A; i++) {
			for(int j=0; j<Y; j++) {
				arrA[i][j] = arrB[i][j];
			}
		}
		
		
		//겹치는 부분 
		for(int i=X; i<A; i++) {
			for(int j=Y; j<B; j++) {
				arrA[i][j] = arrB[i][j] - arrA[i-X][j-Y];
			}
		}
		
		
		
		
		for(int i=0; i<A; i++) {
			for(int j=0; j<B; j++) {
				System.out.print(arrA[i][j]+" ");
			}
			System.out.println();
		}
	}

}
728x90
반응형