백준/Java

[백준 자바] 2563번(색종이) - 2차원 배열

gamzaggang7 2024. 3. 25. 14:04
728x90

난이도 - 실버 5

 

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 


 

728x90

문제를 해결하기 위해 2차원 배열을 사용한다. boolean배열로 선언하고 boolean배열의 초기값은 false이므로 색종이를 붙인 곳은 true로 바꿔준다. 배열의 크기는 도화지 크기인 100 * 100이다.

색종이의 크기는 10*10이므로 outer loop의 범위는 (첫번째 자연수 ~ 첫번째 자연수 + 10)이고, inner loop의 범위는 (두번째 자연수 ~ 두번째 자연수 + 10)이 된다. 해당 배열 값이 false인 경우, 즉 색종이가 붙여지지 않은 경우라면 true로 전환하고 count를 1 증가시킨다. true인 경우 이미 색종이가 붙여진 곳이므로 그냥 넘어간다.

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

public class Main2563 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

        StringTokenizer st;

        while (n-- > 0) {
            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 (!arr[j][k]) {
                        arr[j][k] = true;
                        count++;
                    }
        }

        bw.write(String.valueOf(count));

        bw.flush();
        br.close();
        bw.close();
    }
}

728x90