본문 바로가기
백준알고리즘/그래프와순회

(Python/🥈1)백준알고리즘14716번 : 현수막

by windy7271 2023. 7. 31.
728x90
반응형

문제 바로가기 

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

문제: 

ANT가 처음 알고리즘 대회를 개최하게 되면서 현수막을 내걸었다. 저번 학기 영상처리 수업을 듣고 배웠던 지식을 최대한 응용 해보고 싶은 혁진이는 이 현수막에서 글자가 몇 개인지 알아보는 프로그램을 만들려 한다. 혁진이는 우선 현수막에서 글자인 부분은 1, 글자가 아닌 부분은 0으로 바꾸는 필터를 적용하여 값을 만드는데 성공했다. 그런데 혁진이는 이 값을 바탕으로 글자인 부분 1이 상, 하, 좌, 우, 대각선으로 인접하여 서로 연결되어 있다면 한 개의 글자라고 생각만 하였다. 혁진이가 필터를 적용하여 만든 값이 입력으로 주어졌을 때, 혁진이의 생각대로 프로그램을 구현하면 글자의 개수가 몇 개인지 출력하여라.

입력:

첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250) 두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다.

 

출력:

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

 

풀이:

 

import sys
from collections import deque

sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')

N, M = map(int,sys.stdin.readline().split(" "))
lst = [list(map(int,sys.stdin.readline().rstrip().split(" "))) for _ in range(N)]
move = [(1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)]
visited= [[False] * M for _ in range(N)]

Q = deque()
def bfs(a,b):
    Q.append([a,b])
    visited[a][b] = True
    while Q:
        x, y = Q.popleft()
        for dx, dy in move:
            nx = x + dx
            ny = y + dy
            if 0 <= nx < N and 0 <= ny < M and lst[nx][ny] == 1 and visited[nx][ny] == False:
                Q.append([nx,ny])
                visited[nx][ny] = True

count = 0
for i in range(N):
    for j in range(M):
        if lst[i][j] == 1 and visited[i][j] == False:
            bfs(i,j)
            count += 1

print(count)

 

정석 bfs 사용 

 

+ 대각선 이동 move에 추가 

 

 

반응형

댓글