https://www.acmicpc.net/problem/2567
문제 이해
좌표 계산을 통해 둘레를 하나하나 구해가지고 더하는 것은 너무 어렵다.
결국 배열에 색종이 부분을 칠하고 둘레를 계산하는 것이 최선의 방법인데,
칠한 테두리의 개수를 세서 하려고 하니까 또 엄청 복잡해진다. (모서리를 처리하기 너무 어려움)
결국 인터넷 검색을 통해 찾은 방법은, 색종이들을 다 1로 칠하고 나서, 만약 상하좌우가 0이면 모서리라는 것이다.
즉, 1인데, 상하좌우중에 0이 있으면 그걸 카운트해주면 된다.
노란색이 색종이라 했을 때, 초록색 칸들을 세는 건데
초록색 중에 2라고 써진 부분은 2번 카운트 되는 부분이다.
왜냐면 B4가 한번 카운트하고 C5가 한번 카운트하기 때문이다.
작성 코드
#include <stdio.h>
int N;
int paper[100 + 10][100 + 10];
void color(int x, int y, int n) {
for (int i = x; i < x+10; i++) {
for (int j = y; j < y+10; j++) {
paper[j][i] = 1;
}
}
}
int main(void)
{
// 입력을 받고, 배열에 색종이 부분을 칠한다.
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
int x, y;
scanf("%d %d", &x, &y);
color(x, y, i);
}
// 해당 좌표가 1이면 상하좌우에 0이 있으면 카운트해준다.
int cnt = 0;
for (int i = 0; i < 110; i++) {
for (int j = 0; j < 110; j++) {
if (paper[i][j] == 1) {
if (paper[i][j - 1] == 0) cnt++;
if (paper[i][j + 1] == 0) cnt++;
if (paper[i + 1][j] == 0) cnt++;
if (paper[i - 1][j] == 0) cnt++;
}
}
}
printf("%d", cnt);
return 0;
}
주의할 점:
만약에 색종이를 붙인 위치가 0도 포함한다면 위와 같은 경우가 발생할 수 있다.
그럼 이때는 저 가에 있는 초록색도 판단해줘야 한다.
그럼 왼쪽, 위쪽은 1씩 더해서 끝에서 떨어지게 칠할 수 있도록 해야 한다.
'컴퓨터기본 > 문제풀이' 카테고리의 다른 글
[정올] 1495 : 대각선 지그재그 (0) | 2021.09.03 |
---|---|
[백준] 10799번: 쇠막대기 (0) | 2021.09.03 |
[정올] 2008 : 할부 (0) | 2021.09.03 |
[정올] 2712 : 두 수의 최소합 (0) | 2021.09.03 |
[백준] 5622번: 다이얼 (0) | 2021.08.30 |