본문 바로가기
Programming/BOJ

[C/C++] 백준 #2567 색종이-2(구현)

by 작은별하나 2023. 7. 23.
반응형

이번 문제는 색종이를 붙였을 때, 차지하는 둘레를 구하는 것으로 구현을 하면 됩니다.

 

post it

 

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

 

2567번: 색종이 - 2

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

www.acmicpc.net

 

색종이를 아무 방향이나 붙인다면 아주 어려운 문제가 되겠지만, 축에 평행하게만 붙이고 눈금에 맞추어 붙이기 때문에 색칠하기 문제로 전환해서 풀 수 있습니다.

 

색종이를 붙일 판을 배열로 설정하고, 색종이를 붙이면 그 영역만큼 색칠하면 됩니다.  물론 트리형태로 만들면 더 빠른 속도로 색칠할 수 있겠지만, 여기서는 단순 구현을 하였습니다.

 

문제는 둘레의 길이죠.  둘레의 길이는 색이 바뀌는 지점이 됩니다.  옆의 칸이 색칠이 안 되어 있고, 현재 칸이 색칠이 되어 있다면, 둘레의 길이는 1만큼 늘어나게 됩니다.

 

제가 작성한 소스입니다.

//--------------------------------------------
//    baekjoon #2567
//        - by Aubrey Choi
//        - created at 2019-08-23
//--------------------------------------------
#include <stdio.h>

int main()
{
    int n, x, y, ans=0;
    static char c[100][100];
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d", &x, &y);
        for(int i=y;i<y+10;i++) for(int j=x;j<x+10;j++) c[i][j]=1;
    }
    for(int i=0;i<100;i++)
    {
        for(int j=0;j<100;j++)
        {
            if(!c[i][j]) continue;
            if(i==0||!c[i-1][j]) ans++;
            if(j==0||!c[i][j-1]) ans++;
            if(i==99||!c[i+1][j]) ans++;
            if(j==99||!c[i][j+1]) ans++;
        }
    }
    printf("%d\n", ans);
}
728x90

댓글