여러 개의 색종이를 흰색 도화지에 붙였을 때, 색종이가 붙은 영역의 총 넓이를 구하는 문제입니다. 2차원 배열을 도화지처럼 사용하여 색종이가 붙는 영역을 표시하고, 표시된 영역의 개수를 세는 방식으로 해결하는 것이 핵심입니다.
항목 | 내용 |
---|---|
문제 번호 | 2563번 - 색종이 |
난이도 | 실버 5 |
핵심 알고리즘 | 구현, 2차원 배열 |
N
(1 ≤ N ≤ 100)N
개의 줄: 각 색종이의 왼쪽 아래 꼭짓점의 x, y 좌표이 문제는 2차원 배열을 가상의 '도화지'로 생각하고 접근하면 쉽게 해결할 수 있습니다.
boolean[100][100]
또는 int[100][100]
배열을 생성합니다. 이 배열의 각 칸은 도화지의 1x1 크기 영역을 의미합니다.false
또는 0
으로, '흰색' 상태를 나타냅니다.(x, y)
를 기준으로, 해당 색종이가 차지하는 영역을 2차원 배열에 표시합니다.x
부터 x+9
까지, y
부터 y+9
까지의 영역을 차지합니다.true
또는 1
로 변경하여 '검은색' 상태로 만듭니다.for
반복문을 중첩하여 이 과정을 구현합니다.for (int i = x; i < x + 10; i++) {
for (int j = y; j < y + 10; j++) {
board[i][j] = true; // 또는 1
}
}
true
또는 1
인 칸의 개수를 셉니다.import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 1. 도화지(2차원 배열) 생성
boolean[][] board = new boolean[100][100];
int totalArea = 0;
// 색종이 수 입력
int N = Integer.parseInt(br.readLine());
for (int k = 0; k < N; k++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
// 2. 색종이 붙이기
for (int i = x; i < x + 10; i++) {
for (int j = y; j < y + 10; j++) {
// 이미 칠해진 부분은 다시 세지 않도록 처리
if (!board[i][j]) {
board[i][j] = true;
totalArea++;
}
}
}
}
// 3. 넓이 출력
bw.write(String.valueOf(totalArea));
bw.flush();
bw.close();
br.close();
}
}
항목 | 설명 |
---|---|
좌표와 인덱스 | 문제에서 주어진 (x, y) 좌표를 배열의 인덱스로 그대로 사용할 수 있습니다. 배열 크기를 101x101로 하여 1-based 인덱스를 사용하는 것도 방법입니다. |
넓이 계산 최적화 | 위 코드처럼 색종이를 붙일 때마다 true 로 바꾸면서 동시에 넓이를 더하면, 나중에 배열 전체를 다시 순회할 필요가 없어 더 효율적입니다. |
배열 범위 | 색종이가 x=95, y=95 에 붙는 경우 x+9 , y+9 는 104가 될 수 있습니다. 배열 크기를 [101][101] 또는 넉넉하게 잡는 것이 좋습니다. (위 예제는 0-99 인덱스를 사용하므로 [100][100] 으로 충분합니다) |
자료형 | 도화지 크기와 색종이 수가 정해져 있어 int 범위로 충분히 해결 가능합니다. |
✔️ 2차원 배열을 가상의 도화지로 활용하는 아이디어가 핵심입니다.
✔️ 색종이가 붙는 영역을 배열의 특정 인덱스 범위로 간주하고, 해당 값을 true
또는 1
로 변경합니다.
✔️ 겹치는 부분은 같은 인덱스에 여러 번 덧칠될 뿐, 최종적으로 하나의 칸으로 취급되므로 자연스럽게 처리됩니다.
✔️ 모든 색종이를 붙인 후, true
또는 1
로 표시된 칸의 총 개수를 세면 그것이 곧 넓이입니다.