BOJ

[백준 2563번/JAVA] 색종이 | 이차원 배열

syj0522 2024. 3. 14. 20:41

문제

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

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

100 * 100 도화지에 10 * 10 색종이를 각 변이 평행하도록 붙인다.

색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 넓이를 구하는 문제이다.

색종이는 100장 이하 붙일 수 있으며, 색종이는 도화지 밖으로 나가지 않는다.

풀이

처음엔 다른 방법을 생각 못 하고 당연히 모든 색종이의 넓이 - 겹치는 부분의 넓이를 구하려고 했다.

하지만 이렇게 접근하니 최대 100개가 겹치는 경우까지 고려해야 해서 구현이 너무 어려웠다.

 

쉬운 방법 :

boolean[100][100]의 배열을 선언한다.

입력받은 위치에서 가로 세로 10만큼의 범위를 모두 true로 만든다.

true의 개수를 카운트한다.

코드

import java.util.*;
import java.io.*;

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));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int count = 0;
        boolean[][] arr = new boolean[100][100];

        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            for(int j1=n; j1<n+10; j1++) {
                for(int j2=m; j2<m+10; j2++) {
                    arr[j1][j2] = true;
                }
            }
        }
        for(int i=0; i<100; i++) {
            for(int j=0; j<100; j++) {
                if(arr[i][j] == true)
                    count++;
            }
        }
        bw.write(count + " ");
        bw.close();
    }
}