[Java] Boj 1895: 필터

2025. 2. 22. 14:12·PS/Solve

문제

숫자 9개가 오름차순이나 내림차순으로 정렬되어 있을 때, 중앙값은 다섯 번째 숫자이다. 예를 들어, 1, 3, 4, 1, 2, 6, 8, 4, 10의 중앙값은 4이다. (1 ≤ 1 ≤ 2 ≤ 3 ≤ 4 ≤ 4 ≤ 6 ≤ 8 ≤ 10)

이미지 I는 크기가 R × C인 2차원 픽셀이다. (3 ≤ R ≤ 40, 3 ≤ C ≤ 40) 각 픽셀은 어두운 정도 V를 나타낸다. (0 ≤ V ≤ 255)

중앙 필터는 이미지에 있는 노이즈를 제거하는 필터이다. 필터의 크기는 3 × 3이고, 이미지의 중앙값을 찾으면서 잡음을 제거한다.

예를 들어, 아래와 같은 6 × 5 이미지가 있다.

필터링된 이미지의 크기는 4 × 3이고, 아래와 같다.

가장 왼쪽 윗 행에 필터를 두고, 오른쪽으로 움직이면서 중앙값을 찾는다. 한 행을 모두 이동했으면, 다음 행으로 이동해 다시 중앙값을 찾는다. 아래와 같은 순서를 가진다.

위의 그림에서 각각의 중앙값은 36, 36, 21이 된다. 이 값은 필터링된 이미지 J의 첫 행과 같다. 

이미지 I가 주어졌을 때, 필터링 된 이미지 J를 구하고, 값이 T보다 크거나 같은 픽셀의 수를 구하는 프로그램을 작성하시오.

예를 들어, T = 40일 때, 위의 예에서 정답은 7이다. 

 

입력

첫째 줄에 이미지의 크기 R과 C가 주어진다. 그 다음 R개의 각 줄에는 C개의 픽셀 값이 주어진다. 마지막 줄에는 T값이 주어진다.

출력

첫째 줄에 필터링 된 이미지 J의 각 픽셀 값 중에서 T보다 크거나 같은 것의 개수를 출력한다.


풀이

입력받는 2차원 배열에 대해 3 * 3 필터로 중앙값을 찾고, 그 중앙값이 T보다 크다면 count를 증가시켜주면 되는 단순 구현 문제이다.

여담으로 문제가 인공지능의 노이즈 제거와 관련이 있는데, 커널의 중앙값을 택해 영상을 필터링하는 방법으로 이 방법을 중간값 필터링이라 한다.

인공지능 강의가 어려워서 따라가기 정말 힘들었는데 오랜만에 필터링을 또 보니까 뭔가 반가운..?

 

코드

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
34
35
36
37
38
39
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        PriorityQueue<Integer> pq;
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[][] arr = new int [n][m];
        int cnt = 0;
        for (int i=0; i<n; i++) {
            st = new StringTokenizer(bf.readLine());
            for (int j=0; j<m; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        int t = Integer.parseInt(bf.readLine());
        for (int i=0; i<n-2; i++) {
            for (int j=0; j<m-2; j++) {
                pq = new PriorityQueue<>();
                for (int x=i; x<=i+2; x++) {
                    for (int y=j; y<=j+2; y++) {
                        pq.add(arr[x][y]);
                    }
                }
                for (int x = 0; x < 4; x++) {
                    pq.poll();
                }
                if (pq.poll() >= t)
                    cnt++;
            }
        }
        System.out.println(cnt);
    }
}
Colored by Color Scripter
cs

'PS > Solve' 카테고리의 다른 글

[Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1  (1) 2025.03.04
[Java] Boj 13417: 카드 문자열  (0) 2025.02.22
[Java] Boj 11899: 괄호 끼워넣기  (0) 2025.02.22
[Java] Boj 1531: 투명  (0) 2025.02.22
[Java] Boj 11659: 구간 합 구하기 4  (0) 2025.02.21
'PS/Solve' 카테고리의 다른 글
  • [Java] Boj 23968: 알고리즘 수업 - 버블 정렬 1
  • [Java] Boj 13417: 카드 문자열
  • [Java] Boj 11899: 괄호 끼워넣기
  • [Java] Boj 1531: 투명
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (49) N
      • Algorithm (2)
      • PS (15)
        • Solve (15)
      • CS (32) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (16) N
        • 형식언어 (0)
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인 패턴
    어휘 분석기
    프로그래밍 언어론
    최단 경로
    PS
    BOJ
    백준23882
    백준13417
    플로이드 - 워셜
    자료구조
    알고리즘
    PLT
    백준
    함수
    soild 패턴
    디자인패턴
    언어 타입
    의미론
    객체지향
    백준 6825
    백준1895
    블록 구조 언어
    선택 정렬
    백준 10867
    다이나믹 프로그래밍
    객체지향설계
    백준 11899
    백준1531
    자료형
    누적 합 알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[Java] Boj 1895: 필터
상단으로

티스토리툴바