백준 - 16967번(배열 복원하기)

최지홍·2022년 2월 20일
0

백준

목록 보기
70/145

문제 출처: https://www.acmicpc.net/problem/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를 구해보자.

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

public class Main {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        int H = Integer.parseInt(tokenizer.nextToken()); // 행
        int W = Integer.parseInt(tokenizer.nextToken()); // 열
        int X = Integer.parseInt(tokenizer.nextToken()); // 행 이동
        int Y = Integer.parseInt(tokenizer.nextToken()); // 열 이동

        int[][] temp = new int[H + X][W + Y]; // 타겟 배열
        for (int i = 0; i < H + X; i++) { // 배열 초기화
            tokenizer = new StringTokenizer(reader.readLine());
            for (int j = 0; j < W + Y; j++) {
                temp[i][j] = Integer.parseInt(tokenizer.nextToken());
            }
        }

        for (int i = X; i < H; i++) {
            for (int j = Y; j < W; j++) {
                temp[i][j] = temp[i][j] - temp[i - X][j - Y];
            }
        }

        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {
                sb.append(temp[i][j]).append(" ");
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }

}

  • 배열이 겹치는 부분은 X행 Y열이 시작인 것을 찾아 로직을 구현하였다.
  • X행 Y열부터 반복을 돌며 현재 위치에서 행은 X를 빼고 열은 Y만큼 뺀 위치에 있는 값을 현재 값에서 빼서 원래의 값을 찾았다.
profile
백엔드 개발자가 되자!

0개의 댓글