백준 문제

백준 2567(색종이2) JAVA

kangyuseok 2023. 7. 11. 23:21
728x90

문제

 

2567번: 색종이 - 2

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

www.acmicpc.net

100 * 100 인 공간에서 길이가 10인 정사각형 색종이 좌표가 n개 주어졌을 때 

n개의 색종이의 둘레를 구하는 문제입니다.

단순히 가로와 세로의 길이만 구하면 되는 문제 같지만

왼쪽 그림과 같이 중간에 구멍 둘레도 구해야 하기 떄문에 까다로운 문제입니다.

 

아이디어만 생각하면 간단한 문제입니다.

100 * 100 이차원 공간에서 색종이로 덮힌 공간은 1로 채우고, 

1로 채운 공간을 4방향으로 순회하면서 0인 갯수를 세어주면 둘레가 됩니다.

 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class boj_2563_색종이2 {
    static int [][]arr = new int[101][101];
    static int []dx = {0, 1, 0, -1};
    static int []dy = {1, 0, -1, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());

        int ans=0;
        //1을 만나면 주변(4방향)의 0의 개수를 세면 둘레가 된다.
        for(int i=0; i<n;i++){
            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++){
                    arr[j][k]=1;
                }
            }
        }
        for(int i=1;i<=100;i++) {
            for (int j = 1; j <= 100; j++) {
                if (arr[i][j]==1) ans+=zeroCheck(i, j);
            }
        }
        System.out.println(ans);
    }
    static int zeroCheck(int x, int y){
        int zeroCnt = 0;
        for(int i=0;i<4;i++){
            int xx = x +dx[i];
            int yy = y + dy[i];
            //if(xx<1 || yy<1 || xx>100 || yy>100)continue; 여기 주석 처리하니까 됨
            if(arr[xx][yy]==0)zeroCnt++;
        }
        return zeroCnt;
    }
}