문제 출처 : 2563번: 색종이
만약 색종이가 겹치지 않았다면, 색종이의 넓이를 구하고 갯수만큼 곱해주면 되는 문제지만, 겹치는 영역에 있다면 해당 부분을 제외해줘야합니다.
맨 처음 이 문제를 접했을 때 겹치는 영역은 어떤 방식으로 구해줘야할까? 깊이 고민했습니다. 수학적으로 접근해야하는 문제라고 생각했지만, 문제의 카테고리는 2차원 배열이기 때문에 2차원 배열로 해결할 수 있는 방법을 선택했습니다.
2차원 배열로 할 수 있는 방법을 생각하다보니 색종이의 넓이를 1칸씩 색칠할때마다 값을 1로 바꿔주고, 색칠하지 않은 영역에 대해선 0으로 초기화해주는 작업입니다.
2차원배열[][] 변수명 = new 2차원배열[100][100];
for (int j = x; j < x + 10 ; j++) {
for (int k = y; k < y + 10; k++) {
// 0인 곳은 아직 색칠하지 않은 곳, 1은 색칠한 곳
if (square[j][k] == 0) {
square[j][k] = 1;
answer++;
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_2563 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] square = new int[101][101];
int answer = 0;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
for (int j = x; j < x + 10 ; j++) {
for (int k = y; k < y + 10; k++) {
if (square[j][k] == 0) {
square[j][k] = 1;
answer++;
}
}
}
}
System.out.println(answer);
}
}