접근

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

 

16967번: 배열 복원하기

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

www.acmicpc.net

처음 문제를 보고서는 0, 0부터 H + X, W + Y 까지 모두 탐색 후 중간에 겹치는 부분을 다시 한번 탐색하면서 이미 구해진 숫자를 가지고 유추해야하나 생각했지만 조금 더 생각해보니 그냥 0, 0 부터 H, W 까지 한번만 탐색해도 전체 배열의 모습을 구할 수 있었습니다.

다음과 같이 배열 A를 세부분으로 나누어 문제를 해결할 수 있습니다.

  1. r 이 X 보다 작은 경우 겹치지 않는 부분이므로, 인풋으로 주어진 배열과 동일한 값을 저장
  2. r 이 X 보다 크거나 같으면서 c가 Y 보다 작은 경우 마찬가지로 겹치지 않는 부분이므로, 인풋으로 주어진 배열과 동일한 값을 저장
  3. 위에서 구한 나머지 부분의 경우 X, Y 이동으로 인해 겹쳐지는 부분이므로, 인풋으로 주어진 배열에서 이미 구해진 정답 배열의 값을 적절하게 계산

코드

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

public class Main {

  static int H, W, R, C;
  static int[][] input_map;
  static int[][] ans_map;

  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());
    R = Integer.parseInt(st.nextToken());
    C = Integer.parseInt(st.nextToken());
    input_map = new int[H + R][W + C];
    ans_map = new int[H][W];
    for (int i = 0; i < H + R; i++) {
      st = new StringTokenizer(br.readLine());
      for (int j = 0; j < W + C; j++) {
        input_map[i][j] = Integer.parseInt(st.nextToken());
      }
    }
    br.close();
    for (int r = 0; r < H; r++) {
      for (int c = 0; c < W; c++) {
        if (r < R) {
          ans_map[r][c] = input_map[r][c];
        } else {
          if (c < C) {
            ans_map[r][c] = input_map[r][c];
          } else {
            ans_map[r][c] = input_map[r][c] - ans_map[r - R][c - C];
          }
        }
      }
    }
    printans();
  }

  static void printans() {
    StringBuilder sb = new StringBuilder();
    for (int r = 0; r < H; r++) {
      for (int c = 0; c < W; c++) {
        sb.append(ans_map[r][c]).append(' ');
      }
      sb.append('\n');
    }
    System.out.print(sb.toString());
  }
}

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형

'코딩 > 백준 (JAVA)' 카테고리의 다른 글

백준 3109번: 빵집 (Java)  (0) 2022.08.13
백준 17182번: 우주 탐사선 (Java)  (0) 2022.08.09
백준 16918번: 봄버맨 (Java)  (0) 2022.08.06
백준 14529: Where's Bessie? (Java)  (0) 2022.08.06
백준 10875번: 뱀 (Java)  (0) 2022.07.25
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기