관리 메뉴

커리까지

[백준] 21938번 영상처리 파이썬 본문

알고리즘/풀이

[백준] 21938번 영상처리 파이썬

목표는 커리 2023. 9. 5. 21:53
728x90
SMALL

문제

간단하지만 귀찮은 영상처리 과제가 주어졌다. 과제의 명세는 다음과 같다.

세로 길이가 �$N$이고 가로 길이가 �$M$인 화면은 총 �$N$ × �$M$개의 픽셀로 구성되어 있고 (�,�)$(i, j)$에 있는 픽셀은 ��,�$R_{i,j}$ (Red), ��,�$G_{i,j}$ (Green), ��,�$B_{i,j}$ (Blue) 3가지 색상의 의미를 담고 있다. 각 색상은 0이상 255이하인 값으로 표현 가능하다.

모든 픽셀에서 세 가지 색상을 평균내어 경계값 �$T$보다 크거나 같으면 픽셀의 값을 255로, 작으면 0으로 바꿔서 새로운 화면으로 저장한다.

새로 만들어진 화면에서 값이 255인 픽셀은 물체로 인식한다. 값이 255인 픽셀들이 상하좌우로 인접해있다면 이 픽셀들은 같은 물체로 인식된다.

화면에서 물체가 총 몇 개 있는지 구하는 프로그램을 작성하시오.

입력

화면의 세로 �$N$, 가로 �$M$ 값이 공백으로 구분되어 주어진다.

두 번째 줄부터 �+1$N + 1$줄까지 �$i$번째 가로를 구성하고 있는 픽셀의 ��,�$R_{i,j}$, ��,�$G_{i,j}$, ��,�$B_{i,j}$의 값이 공백으로 구분되어 총 �$M$개 주어진다.

마지막 줄에는 경계값 �$T$가 주어진다.

출력

화면에 있는 물체의 개수를 출력하라. 만약 물체가 없으면 0을 출력하면 된다.

제한
  •  1≤�,�≤1,000$1 \le N, M \le 1,000$ 
  •  0≤��,�,��,�,��,�≤255$0 \le R_{i,j}, G_{i,j}, B_{i,j} \le 255$, ��,�,��,�,��,�$R_{i,j}, G_{i,j}, B_{i,j}$ 값은 정수
  •  0≤�≤255$0 \le T \le 255$, �$T$ 값은 정수
예제 입력 1
3 3
255 255 255 100 100 100 255 255 255
100 100 100 255 255 255 100 100 100
255 255 255 100 100 100 255 255 255
101
예제 출력 1
5

제출 답안

import sys

sys.setrecursionlimit(10**9)
input = sys.stdin.readline


dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]

n, m = map(int, input().split())
picture = [list(map(int, input().split())) for _ in range(n)]
visited = [[False] * m for _ in range(n)]
t = int(input())
graph = [[] * m for _ in range(n)]

for i in range(n):
    row = picture[i]
    for j in range(0, (m * 3), 3):
        avg = sum(row[j : j + 3])
        if (t * 3) <= avg:
            avg = 255
        else:
            avg = 0
        graph[i].append(avg)


def dfs(y, x):
    for i in range(4):
        ny = y + dy[i]
        nx = x + dx[i]
        if 0 <= ny < n and 0 <= nx < m:
            if not visited[ny][nx]:
                if graph[ny][nx] == 255:
                    visited[ny][nx] = True
                    dfs(ny, nx)


answer = 0
for y in range(n):
    for x in range(m):
        if not visited[y][x]:
            if graph[y][x] == 255:
                visited[y][x] = True
                dfs(y, x)
                answer += 1
print(answer)
728x90
LIST
Comments