728x90
백준 1895 : 필터
https://www.acmicpc.net/problem/1895
문제
숫자 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
'알고리즘 > 백준' 카테고리의 다른 글
BOJ(C++) / 백준 2457 : 공주님의 정원 (0) | 2021.10.10 |
---|---|
BOJ(C++) / 백준 16198 : 에너지모으기 (0) | 2021.10.10 |
알고리즘(C++) / 백준 1937 : 욕심쟁이 판다 (0) | 2021.06.22 |
알고리즘(C++) / 백준 5014 : 스타트링크 (0) | 2021.06.22 |
알고리즘(C++) / 백준 1012 : 유기농 배추 (0) | 2021.06.21 |
댓글