본문 바로가기
백준

[백준] 2563번 : 색종이 – JAVA [자바]

by Hongwoo 2022. 8. 8.
반응형

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

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 2563번 색종이는 브론즈 1 난이도의 구현 문제이다. 이 문제에서는 가로, 세로 크기각 각각 100인 도화지가 하나 있다. 그리고 이 도화지 위에 가로, 세로 크기가 각각 10인 색종이 N개를 겹쳐도 되도록 붙인다. 이때 이 색종이들이 차지하는 총넓이를 구하면 된다.

 

이 문제를 수학적으로 구할 수 있겠으나 이 글에서는 수학적인 방법 말고 원초적으로 풀어보려고 한다. 우선 이 도화지를 나타낼 boolean형 배열을 크기가 [101][101]인 배열 arr을 선언한다. 만약에 어떤 수 x, y에 대해 arr [x][y]가 true면 그 부분은 색종이가 붙어져 있다는 것을 뜻한다.

 

for-loop을 이용해서 색종이 N개를 입력받는다. 그리고 색종이의 왼쪽 변의 점 x, y가 주어지면 (x, y)부터 (x + 9, y + 9)까지 색종이가 붙어져 있다는 것을 의미한다. 따라서 이중 for-loop을 이용해 arr [x][y]부터 arr [x+9][y+9]를 true로 시켜준다. 그리고 맨 마지막에 true인 개수를 출력하면 된다.

 

자세한 코드는 밑에 있다.

 


  • 코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int total = 0;  //검은 영역의 넓이
        int n = Integer.parseInt(br.readLine());  //색종이 개수
        boolean[][] arr = new boolean[101][101];  //도화지
        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());
            //(x,y)부터 (x+9, y+9)까지의 영역을 하나씩 체크한 후 총 넓이에 더해준다
            for (int j = x; j < x+10; j++) {
                for (int k = y; k < y+10; k++) {
                    if (!arr[j][k]) {
                        arr[j][k] = true;
                        total++;
                    }
                }
            }
        }
        System.out.print(total);
    }
}

 

 

반응형

댓글