ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2567. 색종이 - 2
    PS/Java 2022. 3. 31.

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

     

    예를 들어 흰색 도화지 위에 네 장의 검은색 색종이를 <그림 1>과 같은 모양으로 붙였다면 검은색 영역의 둘레는 96 이 된다.

     


    입력

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

    출력

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


    예제 입력 1 

    4
    3 7
    5 2
    15 7
    13 14

    예제 출력 1

    96

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            int n = scanner.nextInt();
    
            int[][] arr = new int[101][101];
    
            for(int i = 0; i < n; i++) {
                int x = scanner.nextInt();
                int y = scanner.nextInt();
    
                for(int j = x; j < x + 10; j++) {
                    for(int k = y; k < y + 10; k++) {
                        arr[j][k] = 1;
                    }
                }
            }
            int count = 0;
            int[] dx = {0, 0, -1, 1};
            int[] dy = {-1, 1, 0, 0};
    
            for(int i = 0; i <= 100; i++) {
                for(int j = 0; j <= 100; j++) {
                    if(arr[i][j] == 1) {
                        for(int k = 0; k < 4; k++) {
                            int newX = i + dx[k];
                            int newY = j + dy[k];
    
                            if(arr[newX][newY] == 0) {
                                count++;
                            }
                        }
                    }
                }
            }
            System.out.println(count);
        }
    }

    색종이의 크기는 10으로 고정. 입력으로 주어지는 값은 맨 왼쪽 아래 꼭짓점이므로 입력받은 좌표부터 +10 좌표까지 1로 채운다. 이미 1이라는 값이 있어도 전부 채운다.

     

    색종이가 덮인 부분의 둘레를 구하기 위해선 1과 붙어있는 0의 개수를 세면 되는데 1이 시작되는 지점에서 bfs를 이용해 상하좌우 이동을 하면서 0인 부분이 있으면 count를 해 주면 된다.

    'PS > Java' 카테고리의 다른 글

    [백준] 5430. AC  (0) 2022.03.31
    [백준] 3109. 빵집  (0) 2022.03.31
    [백준] 2458. 키 순서  (0) 2022.03.31
    [백준] 1181. 단어 정렬  (0) 2022.03.31
    [백준] 1260. DFS와 BFS  (0) 2022.03.31

    댓글

Designed by Tistory.