백준 2563번: 색종이

레곤토르닉·2025년 8월 8일
0

BaekJoon

목록 보기
21/64
post-thumbnail

백준 2563번: 색종이

여러 개의 색종이를 흰색 도화지에 붙였을 때, 색종이가 붙은 영역의 총 넓이를 구하는 문제입니다. 2차원 배열을 도화지처럼 사용하여 색종이가 붙는 영역을 표시하고, 표시된 영역의 개수를 세는 방식으로 해결하는 것이 핵심입니다.


✅ 문제 개요

항목내용
문제 번호2563번 - 색종이
난이도실버 5
핵심 알고리즘구현, 2차원 배열

✅ 문제 설명 요약

  • 입력:
    1. 첫째 줄: 색종이의 수 N (1 ≤ N ≤ 100)
    2. 둘째 줄부터 N개의 줄: 각 색종이의 왼쪽 아래 꼭짓점의 x, y 좌표
  • 출력: 색종이가 붙은 검은 영역의 총 넓이
  • 규칙:
    • 가로, 세로 크기가 100인 흰색 도화지가 주어집니다.
    • 가로, 세로 크기가 10인 검은색 색종이를 이 도화지에 붙입니다.
    • 색종이 여러 장이 겹쳐 붙을 수 있으며, 겹친 부분은 한 번만 계산합니다.

✅ 풀이 전략

이 문제는 2차원 배열을 가상의 '도화지'로 생각하고 접근하면 쉽게 해결할 수 있습니다.

1️⃣ 2차원 배열로 도화지 만들기

  • 가로, 세로 크기가 100인 도화지를 표현하기 위해 boolean[100][100] 또는 int[100][100] 배열을 생성합니다. 이 배열의 각 칸은 도화지의 1x1 크기 영역을 의미합니다.
  • 배열의 모든 값은 초기에 false 또는 0으로, '흰색' 상태를 나타냅니다.

2️⃣ 색종이 붙이기

  • 입력받은 각 색종이의 왼쪽 아래 꼭짓점 좌표 (x, y)를 기준으로, 해당 색종이가 차지하는 영역을 2차원 배열에 표시합니다.
  • 색종이는 가로, 세로 크기가 10이므로, x부터 x+9까지, y부터 y+9까지의 영역을 차지합니다.
  • 이 영역에 해당하는 2차원 배열의 값을 true 또는 1로 변경하여 '검은색' 상태로 만듭니다.
  • for 반복문을 중첩하여 이 과정을 구현합니다.
    for (int i = x; i < x + 10; i++) {
        for (int j = y; j < y + 10; j++) {
            board[i][j] = true; // 또는 1
        }
    }

3️⃣ 넓이 계산하기

  • 모든 색종이를 붙인 후, 2차원 배열 전체를 순회하면서 값이 true 또는 1인 칸의 개수를 셉니다.
  • 이 개수가 바로 색종이가 붙은 총 넓이가 됩니다. 겹친 부분은 이미 하나의 칸으로 처리되었으므로 추가 계산이 필요 없습니다.

✅ Java 코드 예제

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로 표시된 칸의 총 개수를 세면 그것이 곧 넓이입니다.

profile
기록은 나의 무기, 원칙은 나의 방패

0개의 댓글