접근
https://www.acmicpc.net/problem/16967
처음 문제를 보고서는 0, 0부터 H + X, W + Y 까지 모두 탐색 후 중간에 겹치는 부분을 다시 한번 탐색하면서 이미 구해진 숫자를 가지고 유추해야하나 생각했지만 조금 더 생각해보니 그냥 0, 0 부터 H, W 까지 한번만 탐색해도 전체 배열의 모습을 구할 수 있었습니다.
다음과 같이 배열 A를 세부분으로 나누어 문제를 해결할 수 있습니다.
- r 이 X 보다 작은 경우 겹치지 않는 부분이므로, 인풋으로 주어진 배열과 동일한 값을 저장
- r 이 X 보다 크거나 같으면서 c가 Y 보다 작은 경우 마찬가지로 겹치지 않는 부분이므로, 인풋으로 주어진 배열과 동일한 값을 저장
- 위에서 구한 나머지 부분의 경우 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 |
최근댓글