

문제 요약
그렇게 어렵지는 않은 문제로 이미지 I가 주어졌을 때, 3*3 크기의 필터를 사용하여 이미지 전체를 훑고 지나가면서 중앙값을 저장한 더 작은 크기의 이미지를 만들면 된다.
이미지 결과를 출력할필요는 없고, 그 개수만 출력하면 되기 때문에 굳이 2차원 배열에 이를 따로 저장할 필요는 없다.
코드 전문
#include <iostream>
#include <set>
using namespace std;
int main(int argc, const char * argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int R, C;
cin >> R >> C; // 행과 열 입력
int I[41][41];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> I[i][j]; // 행렬 데이터 입력
}
}
int T; // 기준 값 입력
cin >> T;
int temp = 0; // 조건을 만족하는 3x3 필터의 개수
for (int i = 0; i <= R - 3; i++) { // 3x3 필터를 적용할 수 있는 행 범위
for (int j = 0; j <= C - 3; j++) { // 3x3 필터를 적용할 수 있는 열 범위
multiset<int> ms;
// 3x3 필터의 모든 값을 멀티셋에 삽입
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
ms.insert(I[i + k][j + l]);
}
}
// 멀티셋에서 중앙값 찾기 (5번째 요소: 0-based index 4)
auto it = ms.begin();
advance(it, 4); // 중앙값 위치로 이동
// 중앙값이 T 이상인 경우 카운트 증가
if (*it >= T) {
temp++;
}
}
}
cout << temp << "\n"; // 조건을 만족하는 3x3 필터의 개수 출력
return 0;
}
큰 의미 없지만 해당 코드에서는 정렬된 상태로 저장되는 Set 자료구조를 사용했다. 중복이 가능하기 때문에 멀티셋을 사용하여야 한다. 만약 벡터(배열)를 사용한다면, 그냥 9개의 값을 저장한 다음 정렬하고, 중앙값을 찾으면 된다.
'알고리즘' 카테고리의 다른 글
| BOJ 2240: 자두나무 (c++) (0) | 2025.03.30 |
|---|---|
| BOJ 4963: 섬의 개수 (c++) (0) | 2025.02.16 |
| BOJ 2467: 용액 (C++) (0) | 2025.01.26 |