본문 바로가기

코딩 테스트/BAEKJOON

[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를 구해보자.

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

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

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

문제 풀이

 

자바 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class N16967 {
    private static int h,w,x,y;
    private static int[][] arrB;
    private static int[][] arrA;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        h = Integer.parseInt(st.nextToken());
        w = Integer.parseInt(st.nextToken());
        x = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());

        arrA = new int[h][w];
        arrB = new int[x + h][y + w];

        for(int i = 0; i < x + h; i++){
            st = new StringTokenizer(br.readLine(), " ");
            for(int j = 0; j < y + w; j++){
                arrB[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        //겹치지않는 왼쪽 위 부분
        for(int i=0; i<x; i++) {
            if (y >= 0) System.arraycopy(arrB[i], 0, arrA[i], 0, y);
        }
        for(int i=x; i<h; i++) {
            if (y >= 0) System.arraycopy(arrB[i], 0, arrA[i], 0, y);
        }


        //겹치는 부분
        for(int i=x; i<h; i++) {
            for(int j=y; j<w; j++) {
                arrA[i][j] = arrB[i][j] - arrA[i-x][j-y];
            }
        }

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                // A, B 배열 모두에 포함되는 경우
                if (i >= x && j >= y) {
                    arrA[i][j] = arrB[i][j] - arrA[i - x][j - y];
                }
                else { // 둘 다 포함되지 않거나, 배열 중 하나에 포함되는 경우
                    arrA[i][j] = arrB[i][j];
                }
            }
        }

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                System.out.print(arrA[i][j] + " ");
            }
            System.out.println();
        }
    }
}

 

'코딩 테스트 > BAEKJOON' 카테고리의 다른 글

[Java] 2290 LCD Test  (0) 2024.05.09
[Java] 16931 겉넓이 구하기  (0) 2024.05.08
[Java] 16920 확장게임  (0) 2024.05.02
[Java] 12851 숨바꼭질 2  (0) 2024.04.30
[Java] 14940 쉬운 최단거리  (0) 2024.04.30