14716 현수막

hey hey·2022년 5월 26일
0

알고리즘

목록 보기
49/57
post-thumbnail

문제

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

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

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

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

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

입력

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

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

출력

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

풀이

좌측 위부터 하나씩 확인하여 글자(1) 가 있다면 bfs()를 시작한다.
bfs는 내 8방향 주위를 돌면서 1이 있다면 0으로 바꿔주는 로직이다.
간단히 풀 수 있지만 dfs로 푸니깐 메모리 초과가 난다.. 무슨 문제일까?

import sys
sys.stdin = open('input.txt')
from collections import  deque

N,M = map(int,input().split())
graph = []

for _ in range(N):
    graph.append(list(map(int,input().split())))

def bfs(y,x):
    Q = deque()
    Q.append([y,x])
    graph[y][x] = 0
    dy = [0,0,-1,1,1,1,-1,-1]
    dx = [-1,1,0,0,-1,1,-1,1]
    while Q :
        y,x = Q.popleft()
        for i in range(8):
            ny = dy[i] + y
            nx = dx[i] + x
            if 0<=ny<N and 0<=nx<M:
                if graph[ny][nx] ==1:
                    Q.append([ny,nx])
                    graph[ny][nx] = 0


result = 0

for i in range(N):
    for j in range(M):
        if graph[i][j]==1:
            bfs(i,j)
            result+=1

print(result)
profile
FE - devp

0개의 댓글