이번 문제는 색종이를 붙였을 때, 차지하는 둘레를 구하는 것으로 구현을 하면 됩니다.
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);
}
반응형
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #2578 빙고(구현) (0) | 2023.08.18 |
---|---|
[C/C++] 백준 #2573 빙산(깊이 우선 탐색) (0) | 2023.07.30 |
[C/C++] 백준 #2565 전깃줄(가장 긴 증가하는 부분수열) (0) | 2023.07.19 |
[C/C++] 백준 #2564 경비원(구현) (0) | 2023.07.18 |
[C/C++] 백준 #2553 마지막 팩토리얼 수(수학) (0) | 2023.07.08 |
댓글