ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2567] 색종이-2
    C 프로그래밍/BOJ 2022. 8. 18. 00:22
    728x90

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

     

    2567번: 색종이 - 2

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

    www.acmicpc.net

    #include <stdio.h>
    int n;
    int paper[100 + 2][2 + 2];
    int board[100 + 2][100 + 2];
    
    int dir_x[4] = { -1, 1, 0, 0 }; //udlr
    int dir_y[4] = { 0, 0, -1, 1 };
    
    int total;
    
    void input(void)
    {
    	scanf("%d", &n);
    	for (int i = 0; i < n; i++) {
    		scanf("%d %d", &paper[i][0], &paper[i][1]);
    	}
    }
    
    void fill_board(void)
    {
    	for (int k = 0; k < n; k++) {
    		int x = paper[k][0];
    		int y = paper[k][1];
    		for (int i = x; i < (x + 10); i++) {
    			for (int j = y; j < (y + 10); j++) {
    				board[i][j] = 1;
    			}
    		}
    	}
    }
    
    
    int check_fill(int x, int y)
    {
    	int cnt = 0;
    	for (int i = 0; i < 4; i++) {
    		int nx = x + dir_x[i];
    		int ny = y + dir_y[i];
    		if (board[nx][ny] == 0) cnt++;
    		else continue;
    	}
    	return cnt;
    }
    
    
    void get_len(void)
    {
    	for (int i = 1; i < 101; i++) {
    		for (int j = 1; j < 101; j++) {
    			if (board[i][j] == 1) total += check_fill(i, j);
    		}
    	}
    	return;
    }
    
    int main(void)
    {
    	input();
    	fill_board();
    	get_len();
    	printf("%d", total);
    	return 0;
    }

    이문제도 사실 처음에 아이디어 생각하기 어려웠다.

    근데 앞으로 이런 류의 문제는 일단 전역변수로 int board[100 + 2][100 + 2]; 초기화 시켜놓고, 해당 범위이면 1을 채워서 탐색해야 겠다고 생각했다. 

     

    //fill_board 함수

    이 문제는 도형을 가지고 어떻게 하는게 아니라, 입력받은 좌표를 가지고 색종이부분은 1로 채우고 나머지는 0으로 두어 둘레를 계산해야 쉽게 풀린다. 

     

     //check_fill 함수     //get_len 함수

    둘레는 만약 내가 지금 있는 좌표가 1일때 (색종이 부분) 상, 하, 좌, 우를 살펴봐서 0이면 가장 바깥쪽 부분이므로 cnt++;을 해준다. 

     

     

    예시로 fill_board 함수를 돌려서 0과 1이 채워진 board의 모습을 출력하면 다음과 같다. 

    //input
    4
    3 7
    5 2
    15 7
    13 14
    
    //output
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    이렇게 보면 명확하게 0과 인접해있는 1의 위치에서 cnt++을 해주어야 둘레가 구해진다는 것을 알 수 있다. 

    728x90

    'C 프로그래밍 > BOJ' 카테고리의 다른 글

    [정올 1057] 미친 수열  (0) 2022.08.18
    [사설] 3이 없는 나라  (0) 2022.08.18
    [백준 2564] 경비원  (0) 2022.08.17
    [백준 10828] 스택  (0) 2022.08.15
    [백준 13458] 시험감독  (0) 2022.08.13

    댓글

Designed by Tistory.