본문 바로가기
알고리즘/백준

BOJ(C++) / 백준 1895 : 필터

by clean_h 2021. 10. 10.
728x90

백준  1895 : 필터

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

 

1895번: 필터

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

www.acmicpc.net

 

문제

숫자 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 이미지가 있다.

입력

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

 

출력

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

 

코드

//백준 1895 필터
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	//입력
	int R, C; // 행,열
	cin >> R >> C;
	int board[41][41];
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			int num;
			cin >> num;
			board[i][j] = num;
		}
	}

	int T;
	cin >> T;

	int ans = 0;
	for (int i = 0; i < R - 2; i++) {
		for (int j = 0; j < C - 2; j++) {
			vector<int> v;
			for (int ii = 0; ii < 2; ii++) {
				for (int jj = 0; jj < 2; jj++) {
					v.push_back(board[i + ii][j + jj]);
				}
			} //필터 3x3만큼 push

			sort(v.begin(), v.end()); //정렬

			if (v[4] >= T) // 중앙값 T와 비교
				ans++;
		}
	}
	
	cout << ans << "\n";


	return 0;
}

//걸린시간 : 15분

 

설명

필터링된 이미지의 크기는 R-2 x C-2 사이즈이다. 

가장 왼쪽 윗 행부터 3x3 사이즈의 크기의 값을 vector에 저장하여 정렬한 후 중앙값을 찾아낸다. 이때 중앙 값이 T의 값보다 크다면 ans의 값을 증가한다.

R-2 x C-2의 크기만큼 반복하여 값을 출력할 수 있다.

 

고찰

걸린 시간 : 15분

어렵지 않게 문제를 풀 수 있었다. 처음에는 3x3 크기를 하나씩 다 입력해주었지만, 반복문을 통해 쉽게 값을 얻을 수 있었다.

 

난이도(solved)

실버 4

728x90

댓글