본문 바로가기

백준 온라인 저지 (BOJ) 문제풀이

백준 온라인 저지 (BOJ) 14716 현수막

문제

ANT가 처음 알고리즘 대회를 개최하게 되면서 현수막을 내걸었다.

저번 학기 영상처리 수업을 듣고 배웠던 지식을 최대한 응용 해보고 싶은 혁진이는 이 현수막에서 글자가 몇 개인지 알아보는 프로그램을 만들려 한다.

혁진이는 우선 현수막에서 글자인 부분은 1, 글자가 아닌 부분은 0으로 바꾸는 필터를 적용하여 값을 만드는데 성공했다.

그런데 혁진이는 이 값을 바탕으로 글자인 부분 1이 상, 하, 좌, 우, 대각선으로 인접하여 서로 연결되어 있다면 한 개의 글자라고 생각만 하였다.

혁진이가 필터를 적용하여 만든 값이 입력으로 주어졌을 때, 혁진이의 생각대로 프로그램을 구현하면 글자의 개수가 몇 개인지 출력하여라.

입력

첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250)

두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다.

출력

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#pragma warning(disable:4996)
#pragma warning(disable:6031)
char map[250][250];
int d[8][2= { {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1} };
void dfs(int y, int x, int row, int col) {
    if (map[y][x] == '1') {
        map[y][x] = '0';
        for (int i = 0; i < 8; i++) {
            int new_y = y + d[i][0], new_x = x + d[i][1];
            if (new_y < 0 || new_y >= row || new_x < 0 || new_x >= col)continue;
            dfs(new_y, new_x, row, col);
        }
    }
}
int main()
{
    int m, n, ans = 0;
    scanf("%d%d"&m, &n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            scanf(" %c"&map[i][j]);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (map[i][j] == '1') {
                ans++;
                dfs(i, j, m, n);
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
cs

간단하게 dfs로 풀 수 있다.